列表字典(展平)列表

时间:2014-09-16 09:15:47

标签: c# linq dictionary

我有一个类型为<MyKey, List<MyClass>>的字典和一个类型为MyClass的列表。现在我想检查后者中是否有元素未包含在字典中的任何列表中。我的第一种方法是嵌套两个循环(一个用于实际列表,一个用于字典中的列表)。如果找到了一个项目,我可能会破坏内部循环并继续使用外部循环中的下一个元素。

foreach (MyClass feature in features)
{
    bool found = false;
    foreach (var kv in this._features)  // this._features is the dictionary
    {
        if (kv.Value.Contains(feature))
        {
            found = true;
            continue;
        }
    }
    if (!found) result.Add(feature);
}

到目前为止这是有效的,但我更喜欢使用更短的方法,可能使用LINQ。我认为如果我将字典的值压缩成一个列表,它可能会有效,但我不知道如何实现这一点。

1 个答案:

答案 0 :(得分:1)

使用SelectMany将您的值展平为IEnumerable<MyClass>,然后使用Except获取差异:

var differentElements = this._features.SelectMany(x => x.Value).Except(features);
result.AddRange(differentElements);

如果MyClass没有正确覆盖EqualsGetHashCode,这可能无法正常工作。