【问题标题】:comparing two 2d arrays line by line逐行比较两个二维数组
【发布时间】:2015-08-11 15:36:04
【问题描述】:

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

int 测试 = 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 } } 我如何证明这两个数组具有相同的元素,尽管它们的位置不同。

【问题讨论】:

  • 在“else”中你应该退出循环。
  • 如果我在程序中使用上述数组,MessageBox.Show() 将无法正常工作
  • 如何排序?如果它们都以相同的方式排序,那么元素的顺序也会相同,对吧?
  • 每一行已经单独排序,例如上面的例子:{{1},{3,7,8},{3,4},{5,6}} {{3,4} ,{1},{5,6},{3,,8}}

标签: c# arrays


【解决方案1】:

不要使用多维数组,虽然在概念上没问题,但由于多种原因,它们在 .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];
        }
    }
}

关注您的评论

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

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

【讨论】:

  • 感谢您的回答,但我应该使用数组编写代码
  • @sara,问题中没有明确说明。
  • @sara,我扩展了答案。
【解决方案2】:

只是一个补充:您知道您可以简单地将数组(以及更多)与 SequenceEqual 进行比较。如果您真的只想比较数组行,那将更具可读性并且更容易实现。只要把它放在一个循环中,你就可以开始了......

样本数组:

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

【讨论】:

  • 是的,我知道,但我不知道如何在 c# 中将此代码用于二维数组。也许第一个数组的第一行等于第二个数组的第四行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多