在linq中设置相等

Als*_*sin 8 c# linq equality set

我有两个列表A和B(列表).如何以最便宜的方式确定它们是否相等?我可以写一些类似'(A减B)联合(B减A)=空集'或将它们连接在一起并计算元素数量,但它相当昂贵.有解决方法吗?

Luk*_*keH 18

如果列表项的顺序是相关的:

bool areEqual = a.SequenceEqual(b);
Run Code Online (Sandbox Code Playgroud)

如果要将列表视为无序集:

// assumes that the list items are ints
bool areEqual = new HashSet<int>(a).SetEquals(b);
Run Code Online (Sandbox Code Playgroud)

(如果需要该功能,SequenceEqual方法和HashSet<T>构造函数都有带IEqualityComparer<T>参数的重载.)


Max*_*kin 7

那么,这取决于你如何解释你的名单.

如果您将它们视为元组(因此列表中元素的顺序很重要),那么您可以使用以下代码:

    public bool AreEqual<T>(IList<T> A, IList<T> B)
    {
        if (A.Count != B.Count)
            return false;
        for (int i = 0; i < A.Count; i++)
            if (!A[i].Equals(B[i])) 
                return false;
    }
Run Code Online (Sandbox Code Playgroud)

如果您将列表视为集合(因此元素的顺序无关紧要),那么......您使用的是错误的数据结构:

    public bool AreEqual<T>(IList<T> A, IList<T> B)
    {
        HashSet<T> setA = new HashSet<T>(A);
        return setA.SetEquals(B);
    }
Run Code Online (Sandbox Code Playgroud)