一组或其他列表中的值集,但不是两者

时间:2013-02-05 13:11:35

标签: c# linq

我正在分析两个字典,我想要所有键的集合或其他字典但不是两个(我不关心顺序)。由于这只涉及密钥,我们可以使用字典键的IEnumerables来做到这一点。

简单的方法,涉及2次传球:

return first.Keys.Except(second.Keys).Concat(second.Keys.Except(first.Keys));

我们可以联系,因为Excepts保证列表完全不同。

但我觉得有一种更好的,有效的方法可以做到。

1 个答案:

答案 0 :(得分:3)

我更喜欢非LINQy方式:

var set = new HashSet<KeyType>(first.Keys);
set.SymmetricExceptWith(second.Keys);

这是另一种(但不是更好的)LINQy方式:

var result = first.Keys.Union(second.Keys)
                       .Except(first.Keys.Intersect(second.Keys));

如果你正在寻找一些(可能)更高效的东西:

var result = new HashSet<KeyType>();

foreach(var firstKey in first.Keys)
{
    if(!second.ContainsKey(firstKey))
        result.Add(firstKey);    
}

foreach(var secondKey in second.Keys)
{
    if(!first.ContainsKey(secondKey))
        result.Add(secondKey);    
}