我正在尝试检查由int [2]数组组成的列表是否包含某个元素。
简而言之,为什么这会产生错误? 我该如何正确检查?
List < int[] > ngonPairs = new List<int[]> {new int[2] { 0, 1 }};
bool flag = ngonPairs.Contains(new int[2] { 0, 1 });
旗帜永远是假的。
答案 0 :(得分:13)
这是因为
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
对序列进行操作,如果序列中的任何项满足谓词,则返回true
。
在这种情况下,谓词比较来自ngonPairs
的单个项(即数组),然后我们可以使用上面描述的SequenceEqual
将每个数组与我们已知的数组进行比较。
答案 1 :(得分:1)
List包含一个数组对象,但您正在尝试搜索另一个新创建的对象。两个数组对象都不同,因此它总是返回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());