删除所有切换的字典对

时间:2017-02-23 10:26:02

标签: c# linq dictionary

我有Dictionary并希望LINQ - 如果有一对(A,B),则删除所有对(B,A)。

Dictionary<int, int> dictionary = new Dictionary<int, int>();
dictionary.Add(1, 2);
dictionary.Add(3, 4); // keep it
dictionary.Add(4, 3); // remove it
//dictionary.Add(4, 3); // remove it (ignore this impossible line, @Rahul Singh is right)

3 个答案:

答案 0 :(得分:1)

您需要实现自定义相等比较器并使用Distinct方法。

Dictionary<int, int> dictionary = new Dictionary<int, int>();
dictionary.Add(1, 2);
 dictionary.Add(3, 4);
dictionary.Add(4, 3);

var result = dictionary.Distinct(new KeyValuePairEqualityComparer()).ToDictionary(x => x.Key, x => x.Value);
    }

相等比较器定义为

private class KeyValuePairEqualityComparer : IEqualityComparer<KeyValuePair<int, int>>
{
    public bool Equals(KeyValuePair<int, int> x, KeyValuePair<int, int> y)
    {
        return x.Key == y.Value && x.Value == y.Key;
    }

    public int GetHashCode(KeyValuePair<int, int> obj)
    {
        // Equality check happens on HashCodes first.
        // Multiplying key/value pairs, ensures that mirrors
        // are forced to check for equality via the Equals method
        return obj.Key * obj.Value;
    }
}

答案 1 :(得分:0)

天真的方法是根据需要简单地过滤它们。

dictionary = dictionary
.Where( kvp => !(dictionary.ContainsKey(kvp.Value) && dictionary[kvp.Value]==kvp.Key) )
.ToDictionary( kvp => kvp.Key, kvp => kvp.Value )`

答案 2 :(得分:0)

让你的对是(1,2),为了从字典中删除这一对你不需要为这个值而烦恼,因为密钥是唯一的。因此,您可以使用以下代码删除:dictionary.Remove(pair.Key);

但如果在集合中找不到指定的键,则KeyNotFoundException有可能。因此,在继续执行删除之前,最好先检查一下:

int value;
if (dictionary.TryGetValue(pair.Key, out value))
{
   dictionary.Remove(pair.Key);
}