[英]Check for Array in Jagged Array
我试图搜索锯齿状数组中的数组。
以下代码不起作用。 我这是什么错
int[] array1 = { 1, 2 };
int[][] varray = new int[2][];
varray[0] = new int[] { 1, 2 };
varray[1] = new int[] { 3, 4 };
if (varray.Contains(array1))
{
Console.WriteLine("varray contains array1");
}
您可以尝试以下方法:
if (varray.Any(x => x.SequenceEqual(array1)))
{
Console.WriteLine("varray contains array1");
}
您的array1
和varray[0]
指向内存中的不同位置,因此varray[0] == array1
将返回false 。
因此,如果您这样做:
varray[0] = array1;
然后Contains
将返回true 。这是从Contains
(不实现自定义比较器)中获取true
的唯一方法,因为即使两个数组包含相同的元素,它们也指向内存中的不同位置,而是尝试使用SequenceEqual
,如果两个数组包含相同顺序的 相同元素 ,则将返回true。
C#中数组的默认相等比较器仅在两个数组具有相同引用的情况下才发现两个数组相等。 如果用以下命令替换varray[0]
声明:
varray[0] = array1;
现在,您将发现contains
检查返回true。 尽管有几种方法可以解决此问题,但一种特别干净的方法是使用contains
重载,它允许您指定自定义相等比较器。 那你会写
(varray.Contains(array1, new SequenceEqualityComparer()))
您的相等比较器类为:
public class SequenceEqualityComparer : IEqualityComparer<IEnumerable<int>>
{
public bool Equals(IEnumerable<int> x, IEnumerable<int> y)
{
return x.SequenceEqual(y);
}
public int GetHashCode(IEnumerable<int> obj)
{
return obj.GetHashCode();
}
}
这是一个示例,如何在此URL https://ideone.com/rsUxTn上不像Demo那样花哨
using System.IO;
using System;
class Program
{
static void Main()
{
int[] array1 = { 1, 2 };
int[][] varray = new int[4][];
varray[0] = new int[] { 1, 2 };
varray[1] = new int[] { 3, 4 };
varray[2] = new int[] { 3, 4, 1 };
varray[3] = new int[] { 3, 4, 9, 10 };
Console.WriteLine("varray.length = " + varray.Length);
Console.WriteLine("varray[0].length = " + varray[0].Length);
int k = 0;
for (int i = 0; i < varray.Length; i++) {
Console.WriteLine(" i = " + i);
for(int j = 0; j < varray[i].Length; j++) {
if (j < array1.Length && varray[i][j] == array1[k++]) {
Console.WriteLine(" j = " + j);
Console.WriteLine("varray contains array1");
}
}
k = 0;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.