C# 正在检查列表中的数组,使用;列表<;int[]>;。包含(新int[]{..})“;,总是返回false
我试图检查由int[2]数组组成的列表是否包含某些元素 简言之,为什么这会产生错误? 我怎样才能正确地检查这个C# 正在检查列表中的数组,使用;列表<;int[]>;。包含(新int[]{..})“;,总是返回false,c#,contains,C#,Contains,我试图检查由int[2]数组组成的列表是否包含某些元素 简言之,为什么这会产生错误? 我怎样才能正确地检查这个 List < int[] > ngonPairs = new List<int[]> {new int[2] { 0, 1 }}; bool flag = ngonPairs.Contains(new int[2] { 0, 1 }); ListngonPairs=newlist{newint[2]{0,1}; bool flag=ngonPairs.Con
List < int[] > ngonPairs = new List<int[]> {new int[2] { 0, 1 }};
bool flag = ngonPairs.Contains(new int[2] { 0, 1 });
ListngonPairs=newlist{newint[2]{0,1};
bool flag=ngonPairs.Contains(新的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
对序列进行操作,如果序列中的任何项满足谓词,则返回true
在本例中,谓词将比较ngonPairs
(即数组)中的单个项,然后我们可以使用上面描述的SequenceEqual
将这些数组中的每个与已知数组进行比较。这是因为
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
将这些数组中的每个数组与已知数组进行比较。列表包含一个数组对象,但您正在尝试搜索另一个新创建的对象。两个数组对象都不同,因此它总是返回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();
}
}
列表包含一个数组对象,但您正在尝试搜索另一个新创建的对象。两个数组对象都不同,因此它总是返回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();
}
}
它通过引用包含等于。int[]Off主题有两个不同的实例:如果您这样创建,则不必添加数组的长度:newint[]{0,1};)您可以删除(2;)它通过引用包含等于。有两个不同的int[]实例脱离主题:如果像这样创建数组,则不必添加数组的长度:new int[]{0,1};)您可以删除(2;)翻译:如果ngonPairs的任何成员是一个元素列表,并且元素列表与我刚刚更新的整数数组中的元素完全相同,则将flag设置为true。使用数组而不是列表进行搜索会更快吗?我将使用int[],而不是List?还是没那么快?数组总是比列表快,因为列表只是数组的包装器。@PetrasVestartas做最明显的事情。如果它很慢,这很重要,以后再测量。不要试图猜测你的程序在哪里会变慢。试着使它正确。列表可以增长,而不是数组。如果您知道adavance中的大小,并且大小是固定的,则可以使用数组。否则,请使用
列表
。翻译:如果ngonPairs的任何成员是与我刚刚更新的整数数组中的元素完全相同的元素列表,则将flag设置为true。使用数组而不是列表进行搜索会更快吗?我将使用int[],而不是List?还是没那么快?数组总是比列表快,因为列表只是数组的包装器。@PetrasVestartas做最明显的事情。如果它很慢,这很重要,以后再测量。不要试图猜测你的程序在哪里会变慢。试着使它正确。列表可以增长,而不是数组。如果您知道adavance中的大小,并且大小是固定的,则可以使用数组。否则,请使用列表
。理论上是正确的,尽管当数组大于2个项目时,我不想被这个API所欺骗。这只是一个示例,它可以被增强以处理大于2个大小的数组,如果给定的两个数组对象大小不同,则需要进行验证。公共覆盖bool Equals(int[]x,int[]y){return Enumerable.SequenceEquals(x,y);}
=^ ^=理论上正确,但当数组大于2个项时,我不想被这个API所欺骗。这只是一个示例,如果给定的两个数组对象的大小不同,可以增强它以处理大于2的数组和所需的验证。public override bool Equals(int[]x,int[]y){return Enumerable.SequenceEquals(x,y);}
=^_^=