我有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)
答案 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);
}