我有一个类型为<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。我认为如果我将字典的值压缩成一个列表,它可能会有效,但我不知道如何实现这一点。
答案 0 :(得分:1)
使用SelectMany
将您的值展平为IEnumerable<MyClass>
,然后使用Except
获取差异:
var differentElements = this._features.SelectMany(x => x.Value).Except(features);
result.AddRange(differentElements);
如果MyClass
没有正确覆盖Equals
和GetHashCode
,这可能无法正常工作。