如何在C#/ LINQ中获得所有不同的对组合?

时间:2014-05-21 13:02:35

标签: c# linq

我有一对具有相同类型的元组,例如:[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(对)?

解决方案:

正如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();
    }
}

2 个答案:

答案 0 :(得分:12)

有一个Enumerable.Distinct overload,可让您指定IEqualityComparer

提供认为[1,2]和[2,1]相等的自定义IEqualityComparer<Tuple<T, T>>

实施应该是微不足道的,并留给读者练习。 : - )

答案 1 :(得分:5)

您可以编写一个实现IEqualityComparer<Tuple<int, int>>的类,并在调用Distinct()时使用它:

pairs.Distinct(new YourComparerClass());