使用 "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());
我正在尝试检查由 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());