使用"List <int []>检查列表中的数组.包含(new int [] {..})",始终返回false

Pet*_*tas 1 c# contains

我试图检查由int [2]数组组成的列表是否包含某些元素.

总之,为什么这会产生错误?我该如何正确检查?

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

bool flag = ngonPairs.Contains(new int[2] { 0, 1 });
Run Code Online (Sandbox Code Playgroud)

标志总是错误的.

spe*_*der 13

这是因为

new[]{1, 2} != new[]{1, 2}
Run Code Online (Sandbox Code Playgroud)

它们是不同的数组,对一个的更改不会反映在另一个数组中.

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

new[]{1, 2}.SequenceEqual(new[]{1, 2}) // == true
Run Code Online (Sandbox Code Playgroud)

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

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

.Any对序列进行操作,并且true如果序列中的任何项满足谓词,则返回.

在这种情况下,谓词比较来自ngonPairs(即数组)的单个项目,然后我们可以使用SequenceEqual上述方法将每个数组与我们已知的数组进行比较.

  • 对于数组而不是列表,这种搜索会更快吗?而不是List <int []>我会使用int [] []?还是没那么快? (2认同)