寻找迭代通过层列表的替代方案

时间:2018-04-12 20:15:19

标签: c# .net

这是一个.Net C#程序。这是我拥有的,它有效,但很慢:

外部集合有一个带密钥的记录列表,大约有5500个值 下一个集合包含所有组中密钥的帐户列表,大约有5到10个值 下一个集合有一个密钥所需的组列表,有三个组(但它们各不相同,所以它不是一个常量列表)

我需要弄清楚需要添加什么。如果其中一个组不存在或者缺少任何帐户,则添加。

我从现有的键/组/帐户列表开始。

目前我使用的是这样的东西:

foreach (rec in keysList)
    foreach (account in accountsList)
        foreach (group in groups)
            if (!existing.contains(keys/groups/accounts))
                add record

这很慢,似乎应该有多层嵌套的替代方案。

谢谢, 萨默尔

2 个答案:

答案 0 :(得分:2)

您需要正确使用HashSet<T>才能使其按预期执行。使用HashSet<T>.Contains(T key)

您必须解决的问题是,您的密钥类型必须(正确)IEquatable<Key>实现,或者您必须将IEqualityComparer<Key>的自定义实例传递给HashSet构造函数。

答案 1 :(得分:0)

您可以先将列表展平:

var list = keyList.SelectMany
( 
    k => k.SelectMany
    (
        a => Select
        (
            g => new 
            {
                Group = g,
                Account = a,
                Key = k
            }
        )
    )
);

一旦你的结构在平面列表中,其余的很容易:

var difference = list.Except(otherList);
foreach (var d in difference)
    DoAdd(d.Key, d.Account, d.Group);

请注意,匿名类型按值进行比较,而不是按引用进行比较(它比较所有单个属性,而不是单个对象引用),因此将列表展平为匿名类型也可以解决由对同一数据的差异引用所导致的困难。