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

mam*_*ack 9 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();
}
Run Code Online (Sandbox Code Playgroud)

你将如何实现通用的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Hei*_*nzi 12

有一个Enumerable.Distinct重载,允许您指定一个IEqualityComparer.

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

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


Den*_*s_E 5

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

pairs.Distinct(new YourComparerClass());
Run Code Online (Sandbox Code Playgroud)