我有一组由相同类型的对组成的元组,例如:[1,1][1,2][2,1][2,1]
我需要计算不同的组合:[1,1][1,2]
public void DistinctPairsTest()
{
IList<Tuple<int, int>> pairs = new List<Tuple<int, int>>();
pairs.Add(Tuple.Create(1, 1));
pairs.Add(Tuple.Create(1, 2));
pairs.Add(Tuple.Create(2, 1));
pairs.Add(Tuple.Create(2, 1));
IList<Tuple<int, int>> distinctPairs = GetDistinctPairs(pairs);
Assert.AreEqual(2, distinctPairs.Count);
}
private IList<Tuple<T, T>> GetDistinctPairs<T>(IList<Tuple<T, T>> pairs)
{
throw new NotImplementedException();
}
你如何实现通用的GetDistinctPairs(pairs)?
解决方案:
根据Heinzi和Dennis_E的建议,我实现了一个通用的IEqualityComparer。欢迎提出改进意见 :-)
public class CombinationEqualityComparer<T> : IEqualityComparer<Tuple<T, T>>
{
public bool Equals(Tuple<T, T> x, Tuple<T, T> y)
{
bool equals = new HashSet<T>(new[] { x.Item1, x.Item2 }).SetEquals(new[] { y.Item1, y.Item2 });
return equals;
}
public int GetHashCode(Tuple<T, T> obj)
{
return obj.Item1.GetHashCode() + obj.Item2.GetHashCode();
}
}
Equals([a,b],[b,a])
返回true。IEqualityComparer<T>.GetHashCode的文档中说:“* 实现必须确保如果Equals方法为两个对象x和y返回true,则对于x返回的GetHashCode方法的值必须等于为y返回的值。*" - Heinzireturn new HashSet<T>(new[] {x.Item1, x.Item2}).SetEquals(new[] {y.Item1, y.Item2});
然而,这可能更适合于代码高尔夫比赛... - Heinzi