检查Jagged Array中的Array

时间:2014-03-02 01:02:18

标签: c#

我正在尝试以锯齿状数组搜索数组。

以下代码不起作用。这里我的错误是什么?

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");
}

3 个答案:

答案 0 :(得分:4)

你可以试试这个:

if (varray.Any(x => x.SequenceEqual(array1)))
{
    Console.WriteLine("varray contains array1");
}

您的array1varray[0]指向内存中的不同位置,因此varray[0] == array1将返回 false

所以,如果你这样做:

varray[0] = array1;

然后Contains将返回 true 。这是从true获取Contains(没有实现自定义比较器)的唯一方法,因为即使这两个数组包含相同的元素,它们指向内存中的不同位置。而不是尝试使用SequenceEqual,如果两个数组在相同的顺序中包含相同的元素,它将返回true

答案 1 :(得分:0)

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();
    }
}

答案 2 :(得分:0)

这是一个如何做到这一点的例子 演示此网址https://ideone.com/rsUxTn

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;
        } 
    }
}