假设我有这些记录:
Code |GroupLevel |Group
-----------------------------------
X0000 |4 |
X1000 |3 |X0000
X2000 |3 |X0000
X3000 |3 |X0000
X1100 |2 |X1000
X1200 |2 |X1000
X1300 |2 |X1000
X2100 |2 |X2000
X2200 |2 |X2000
X2300 |2 |X2000
X1110 |1 |X1100
X1120 |1 |X1100
X1111 |0 |X1110
X1112 |0 |X1110
X1113 |0 |X1110
X1114 |0 |X1110
我想要实现的是拥有这种序列号:
Seq |Code |GroupLevel |Group
-------------------------------------
1 |X0000 |4 |
2 |X1000 |3 |X0000
3 |X1100 |2 |X1000
4 |X1110 |1 |X1100
5 |X1111 |0 |X1110
6 |X1112 |0 |X1110
7 |X1113 |0 |X1110
8 |X1114 |0 |X1110
9 |X1120 |1 |X1100
10 |X1200 |2 |X1000
11 |X1300 |2 |X1000
12 |X2000 |3 |X0000
13 |X2100 |2 |X2000
14 |X2200 |2 |X2000
15 |X2300 |2 |X2000
16 |X3000 |3 |X0000
我尝试了固定组级别 (3) 的操作,但如果组级别 > 5,则不会。
这就是我所做的:
List<MySequenceModel> _lstPair = new List<MySequenceModel>();
var _lst = _records.Where(x => x.GroupLevel == 3).ToList();
foreach (var item in _lst)
{
if (_lstPair.Where(x => x.Code.Equals(item.Code)).FirstOrDefault() == null)
_lstPair.Add(new MySequenceModel { Code = item.Code, SeqNo = _seqCounter++ });
var _lst2 = _records.Where(x => x.Group.Equals(item.Code) && !x.Code.Equals(item.Code)).OrderBy(x => x.Code).ToList();
foreach (var _item2 in _lst2)
{
if (_lstPair.Where(x => x.Code.Equals(_item2.Code)).FirstOrDefault() == null)
_lstPair.Add(new MySequenceModel { Code = _item2.Code, SeqNo = _seqCounter++ });
var _lst3 = _records.Where(x => x.Group.Equals(_item2.Code) && !x.Code.Equals(_item2.Code)).OrderBy(x => x.Code).ToList();
foreach (var _item3 in _lst3)
{
if (_lstPair.Where(x => x.Code.Equals(_item3.Code)).FirstOrDefault() == null)
_lstPair.Add(new MySequenceModel { Code = _item3.Code, SeqNo = _seqCounter++ });
var _lst4 = _records.Where(x => x.Group.Equals(_item3.Code) && !x.Code.Equals(_item3.Code)).OrderBy(x => x.Code).ToList();
foreach (var _item4 in _lst4)
{
if (_lstPair.Where(x => x.Code.Equals(_item4.Code)).FirstOrDefault() == null)
_lstPair.Add(new MySequenceModel { Code = _item4.Code, SeqNo = _seqCounter++ });
}
}
}
}
MySequenceModel
是一个类,其中包含报告所需的代码和序列号。伪代码就可以了。
TIA
最佳答案
给定以下输入数据(取自问题):
MySequenceModel[] _records = new MySequenceModel[]
{
new MySequenceModel { Code = "X0000", GroupLevel = 4, Group = "" },
new MySequenceModel { Code = "X1000", GroupLevel = 3, Group = "X0000" },
new MySequenceModel { Code = "X2000", GroupLevel = 3, Group = "X0000" },
new MySequenceModel { Code = "X3000", GroupLevel = 3, Group = "X0000" },
new MySequenceModel { Code = "X1100", GroupLevel = 2, Group = "X1000" },
new MySequenceModel { Code = "X1200", GroupLevel = 2, Group = "X1000" },
new MySequenceModel { Code = "X1300", GroupLevel = 2, Group = "X1000" },
new MySequenceModel { Code = "X2100", GroupLevel = 2, Group = "X2000" },
new MySequenceModel { Code = "X2200", GroupLevel = 2, Group = "X2000" },
new MySequenceModel { Code = "X2300", GroupLevel = 2, Group = "X2000" },
new MySequenceModel { Code = "X1110", GroupLevel = 1, Group = "X1100" },
new MySequenceModel { Code = "X1120", GroupLevel = 1, Group = "X1100" },
new MySequenceModel { Code = "X1111", GroupLevel = 0, Group = "X1110" },
new MySequenceModel { Code = "X1112", GroupLevel = 0, Group = "X1110" },
new MySequenceModel { Code = "X1113", GroupLevel = 0, Group = "X1110" },
new MySequenceModel { Code = "X1114", GroupLevel = 0, Group = "X1110" },
};
然后这有效:
var lookup = _records.ToLookup(x => x.Group);
Func<string, IEnumerable<MySequenceModel>> traverse = null;
traverse = grp => lookup[grp].SelectMany(x => new [] { x }.Concat(traverse(x.Code)));
MySequenceModel[] results =
traverse("")
.Select((x, n) => new MySequenceModel
{
SeqNo = n + 1,
Code = x.Code,
GroupLevel = x.GroupLevel,
Group = x.Group
})
.ToArray();
它给了我:
关于c# - 在 C# 中添加动态层次结构的序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45751237/