You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中比较多维数组(元素位置不同仍返回true)

C#中忽略行内元素顺序比较二维数组

要实现忽略行内元素顺序的二维数组比较,核心思路是确保两个数组结构一致,且每行的元素集合完全匹配(不考虑顺序)。以下是修改后的完整代码:

using System;
using System.Linq;

class Program {
  public static void Main (string[] args) {
    string[,] actual = new string[,]
    {
      {"fruitname", "fruitcolor", "fruitshape"},
      {"banana", "yellow", "rectangle"},
      {"apple", "red", "round"}
    };

    string[,] user1 = new string[,]
    {
      {"fruitname", "fruitcolor", "fruitshape"},
      {"banana", "yellow", "rectangle"},
      {"apple", "red", "round"}
    };
    
    string[,] user2 = new string[,]
    {
      {"fruitshape", "fruitname", "fruitcolor"},
      {"rectangle", "banana", "yellow"},
      {"round", "apple", "red"}
    };
    
    Console.WriteLine(VerifyQueries(actual, user2)); // 输出 True
  }

  public static bool VerifyQueries(string[,] storedQuery, string[,] userQuery) {
    // 检查数组维度和各维度长度是否一致
    if(storedQuery.Rank != userQuery.Rank ||
       !Enumerable.Range(0, storedQuery.Rank)
                  .All(dimension => storedQuery.GetLength(dimension) == userQuery.GetLength(dimension))
      )
    { 
      return false;
    }

    // 快速判断完全顺序匹配的情况
    if(storedQuery.Cast<string>().SequenceEqual(userQuery.Cast<string>())) {
      return true;
    }

    // 逐行检查元素是否为彼此的排列(忽略顺序)
    int rowCount = storedQuery.GetLength(0);
    int colCount = storedQuery.GetLength(1);
    
    for(int row = 0; row < rowCount; row++) {
      // 提取当前行的所有元素并排序
      var storedRowSorted = Enumerable.Range(0, colCount)
                                      .Select(col => storedQuery[row, col])
                                      .OrderBy(s => s)
                                      .ToList();
      var userRowSorted = Enumerable.Range(0, colCount)
                                    .Select(col => userQuery[row, col])
                                    .OrderBy(s => s)
                                    .ToList();
      
      // 比较排序后的行是否一致
      if(!storedRowSorted.SequenceEqual(userRowSorted)) {
        return false;
      }
    }

    return true;
  }
}

关键逻辑说明

  1. 结构校验:先确认两个数组的维度数量、各维度的长度完全一致,避免结构不匹配的无效比较。
  2. 快速匹配:保留原有的SequenceEqual判断,优先处理完全顺序一致的情况,提升效率。
  3. 逐行元素匹配:对每行的元素进行排序后再比较SequenceEqual,这样就能忽略行内元素的顺序,只要元素种类和数量完全相同就判定匹配。

如果需要支持行顺序也可任意的场景(比如user2的行顺序打乱但每行元素匹配也返回true),可以把所有行的排序结果存入一个集合,再比较两个集合是否相等,修改方式如下:

// 替换逐行循环的逻辑
var storedRows = Enumerable.Range(0, rowCount)
                           .Select(row => Enumerable.Range(0, colCount)
                                                    .Select(col => storedQuery[row, col])
                                                    .OrderBy(s => s)
                                                    .ToList())
                           .ToList();
var userRows = Enumerable.Range(0, rowCount)
                         .Select(row => Enumerable.Range(0, colCount)
                                                  .Select(col => userQuery[row, col])
                                                  .OrderBy(s => s)
                                                  .ToList())
                         .ToList();

// 比较两个行集合是否相等(忽略行顺序)
return storedRows.All(row => userRows.Remove(row)) && userRows.Count == 0;

内容的提问来源于stack exchange,提问作者Saksham Saraswat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:45:43