c# - 在 C# 中添加动态层次结构的序列号

标签 c# algorithm

假设我有这些记录:

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();

它给了我:

results

关于c# - 在 C# 中添加动态层次结构的序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45751237/

相关文章:

c# - MySQL 返回列名而不是它们的内容

java - 不使用 HashSet 删除 ArrayList 中的重复元素

algorithm - 这个三重嵌套循环的大 O?

python - 使用分而治之的方法找到列表中出现次数至少为 60% 的元素?

java - 3路/4路循环赛调度算法

c# - 尝试将 Outlook 电子邮件保存在文件夹中

c# - 语义#region 用法

C# Caliburn.Micro 多选

c# - 服务契约中层次结构中的通用接口(interface)

java - 我如何编写大量的 for 循环