使用 "List<int[]>.Contains(new int[] { .. })" 检查列表中的数组,总是 returns false

Checking for an array in a list, with "List<int[]>.Contains(new int[] { .. })", always returns false

我正在尝试检查由 int[2] 数组组成的列表是否包含特定元素。

简而言之,为什么会产生错误? 我该如何正确检查?

List < int[] > ngonPairs = new List<int[]> {new int[2] { 0, 1 }};

bool flag = ngonPairs.Contains(new int[2] { 0, 1 });

标记始终为 false。

这是因为

new[]{1, 2} != new[]{1, 2}

它们是不同的数组,对一个的更改不会反映到另一个。

但是使用 LINQ 的 SequenceEqual,您可以比较两个序列的 内容

new[]{1, 2}.SequenceEqual(new[]{1, 2}) // == true

现在,使用 LINQ 的 Any 您可以:

bool flag = ngonPairs.Any(p => p.SequenceEqual(new int[] {0, 1}));

.Any 对序列进行运算,如果序列中的任何项满足谓词,则 returns true

在这种情况下,谓词比较 ngonPairs 中的单个项目(即数组),然后我们可以使用上面描述的 SequenceEqual 将这些数组中的每一个与我们已知的数组进行比较。

列表包含一个数组对象,但您正在尝试搜索另一个新创建的对象。两个数组对象不同,所以它总是 return false。如果你的目的是比较数组的值,你可以使用 EqualityComparer 来检查。

写一个比较器来比较两个数组。下面的代码片段是示例,它只会比较大小为 2 的 int 数组。

class ArrayComparer : EqualityComparer<int[]>
    {
        public override bool Equals(int[] x, int[] y)
        {

            if (x[0] == y[0] && x[1] == y[1])
                return true;
            else
                return false;
        }

        public override int GetHashCode(int[] obj)
        {
            throw new NotImplementedException();
        }
    }

然后在Contains函数中使用这个EqualityComparer实例来比较数组值;

bool flag = ngonPairs.Contains(new int[2] { 0, 1 }, new ArrayComparer());