如何在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; } }
关键逻辑说明
- 结构校验:先确认两个数组的维度数量、各维度的长度完全一致,避免结构不匹配的无效比较。
- 快速匹配:保留原有的
SequenceEqual判断,优先处理完全顺序一致的情况,提升效率。 - 逐行元素匹配:对每行的元素进行排序后再比较
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
相关产品推荐
相关产品推荐

