如何在List(Of Integer())上做一个截然不同的?

Fre*_*dou 2 .net c# linq vb.net

从此

(vb.net)

    Dim test As New List(Of Integer())
    test.Add(New Integer() {1, 2, 3})
    test.Add(New Integer() {1, 3, 3})
    test.Add(New Integer() {3, 2, 3})
    test.Add(New Integer() {1, 1, 3})
    test.Add(New Integer() {1, 2, 3})
    Dim a = test.Distinct
Run Code Online (Sandbox Code Playgroud)

(C#)

    List<int[]> test = new List<int[]>();
    test.Add(new int[] { 1, 2, 3 });
    test.Add(new int[] { 1, 3, 3 });
    test.Add(new int[] { 3, 2, 3 });
    test.Add(new int[] { 1, 1, 3 });
    test.Add(new int[] { 1, 2, 3 });
    var a = test.Distinct();
Run Code Online (Sandbox Code Playgroud)

不起作用,你会怎么做?

Bro*_*ass 6

Distinct在这种情况下,你必须提供一个自定义的Equality比较器- 否则你正在比较引用,这是一个初始尝试:

class SequenceComparer<T,U> : IEqualityComparer<T> where T: IEnumerable<U>
{
    public bool Equals(T x, T y)
    {
        return Enumerable.SequenceEqual(x, y);
    }

    public int GetHashCode(T obj)
    {
        int hash = 19;
        foreach (var item  in obj)
        {
            hash = hash * 31 + item.GetHashCode();
        }
        return hash;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以在你的电话中使用它Distinct():

var results = test.Distinct(new SequenceComparer<int[],int>())
                  .ToList();
Run Code Online (Sandbox Code Playgroud)

  • @Josh这可能会非常快速地溢出,即使对于小型收藏也是如此.但是由于默认情况下未选中C#,这不是问题.如果它被编译为要检查,则在哈希计算周围放置一个`unchecked`块. (2认同)