逐行比较两个2d阵列

时间:2015-08-11 15:36:04

标签: c# arrays

我正在尝试编写一个用于比较两个2d数组的代码。如果程序可以在第二个数组行中找到一个简单的行应该返回0,否则它应该返回1.但是我不会知道为什么它不起作用。请指导我。 `

int test = 0;

for (int i = 0, q = 0; i < arr.m && q < arr.m; i++, q++)
{
    for (int j = 0, w = 0; j < arr.m && w < arr.m; j++, w++)
    {
        if (a[i, j] == b[q, w])
        { test = 0; }
        else
        {
            q++;
            w = 0;
            if (a[i, j] == b[q, w])
            { test = 0; }
            else 
                test = 1;

        }


    }
}
if (test == 1)
{
    MessageBox.Show("two graphs are different ");
} `

arr.m是数组元素的数量,我应该记住,两个图形的每一行都在之前排序。 我的意思是:

{{1},{7,8,3},{3,4},{5,6}}

{{3,4},{1},{5,6},{7,8,3}} 我怎么能证明这两个数组具有相同的元素,尽管它们没有相同的位置。

2 个答案:

答案 0 :(得分:0)

只是一个补充:你知道你可以简单地将数组(和更多)与SequenceEqual进行比较。如果你真的只想比较数组行,那么它将更易读,更容易实现。把它放在一个循环中,你准备好了......

Samplearray:

int[] arr1 = new int[] { 1,2,3};
int[] arr2 = new int[] { 3,2,1 };

检查:

Console.WriteLine(arr1.SequenceEqual(arr2)); // false
Console.WriteLine(arr1.Reverse().SequenceEqual(arr2)); // true

.Net 4甚至有一种更简单的方法:StructuralComparisons类型:

bool isStructureEqual = arr1.Equals (arr2, StructuralComparisons.StructuralEqualityComparer)); 

答案 1 :(得分:0)

不要使用多维数组,虽然在概念上没问题,但是出于多种原因,他们会使用.Net。

using System.Collections.Generic;
using System.Linq;

var bRows = Enumerable.Range(0, arr.m)
    .Select(i => b.YieldRow(i).ToList())
    .ToList();

var test = Enumerable.Range(0, arr.m)
    .Select(i => a.YieldRow(i))
    .All(aRow => bRows.Any(bRow => aRow.SequenceEqual(bRow)); 

if (test)
{
    MessageBox.Show("two graphs are different ");
}

// ...

public static class Ext
{
    // This is fine for your special case but remember,
    // MD Arrays don't necessarily have a lower bound of 0.
    private IEnumerable<T> YieldRow(this T[,] arr, int row)
    {
        for (var i = 0; i < arr.GetLength(1); i++)
        {
            yield return arr[row, i];
        }
    }
}

发表评论后

问题中声明的数组是锯齿状的,而不是多维的。这个答案继续假设您实际上想要锯齿状数组而不是稀疏填充的多维数组。 e.g。

    var a = new int[4][];
    a[0] = new[] { 1 }; 
    a[1] = new[] { 7, 8 ,3 };
    a[2] = new[] { 3, 4 };
    a[3] = new[] { 5, 6 };

    var b = new int[4][];
    b[0] = new[] { 3, 4 }; 
    b[1] = new[] { 1 };
    b[2] = new[] { 5, 6 };
    b[3] = new[] { 7, 8, 3 };

    var arr = new Arr { m = a.Length };

此算法执行您定义的操作。 Working example here

    var match = false;
    for (var i = 0; i < arr.m; i++)
    {
        for (var q = 0; q < arr.m; q++)
        {
            if (a[i].Length != b[q].Length)
            {
                continue;
            }

            match = true;
            for (var j = 0; j < a[i].Length; j++)
            {
                if (a[i][j] != b[q][j])
                {
                    match = false;
                    break;
                }
            }

            if (match)
            {
                break;
            }
        }

        if (!match)
        {
            break;
        }
    }

    if (!match)
    {
        Console.WriteLine("two graphs are different.");
    }