如何在忽略元素索引的情况下判断两个C#数组是否相同?
判断两个数组是否由相同元素组成(值与数量一致,顺序无关)
原代码的问题
原代码的判断逻辑存在两个核心问题:
- 用
==比较数组是比较引用地址,而非数组内容,所以a == b和a == c永远为false(除非是同一个数组实例)。 - 按索引逐个比较的方式,只能判断顺序完全相同的数组,无法识别元素组成一致但顺序不同的情况(比如示例中的
a和c)。
正确实现方案
方案1:排序后比较
将两个数组排序后,顺序不同但元素组成一致的数组会变成完全相同的序列,再逐个元素对比即可。
using System; using System.Linq; public class ArrayComparer { public static bool AreElementsEqual(int[] arr1, int[] arr2) { // 长度不同直接返回false if (arr1.Length != arr2.Length) return false; // 排序两个数组 var sortedArr1 = arr1.OrderBy(x => x).ToArray(); var sortedArr2 = arr2.OrderBy(x => x).ToArray(); // 逐个元素比较 for (int i = 0; i < sortedArr1.Length; i++) { if (sortedArr1[i] != sortedArr2[i]) return false; } return true; } public static void Main(string[] args) { int[] a = {0, 1, 2, 1}; int[] b = {0, 1, 2, 1}; int[] c = {0, 1, 1, 2}; Console.WriteLine(AreElementsEqual(a, b)); // 输出 True Console.WriteLine(AreElementsEqual(a, c)); // 输出 True } }
方案2:统计元素出现次数(字典法)
通过字典统计第一个数组中每个元素的出现次数,再遍历第二个数组减少对应元素的计数,最终检查所有计数是否为0。这种方法不需要修改原数组,性能在元素重复较多时更优。
using System; using System.Collections.Generic; public class ArrayComparer { public static bool AreElementsEqual(int[] arr1, int[] arr2) { if (arr1.Length != arr2.Length) return false; Dictionary<int, int> elementCount = new Dictionary<int, int>(); // 统计第一个数组的元素次数 foreach (int num in arr1) { if (elementCount.ContainsKey(num)) elementCount[num]++; else elementCount[num] = 1; } // 遍历第二个数组,减少计数 foreach (int num in arr2) { if (!elementCount.ContainsKey(num) || elementCount[num] == 0) return false; elementCount[num]--; } // 检查所有计数是否为0 foreach (var count in elementCount.Values) { if (count != 0) return false; } return true; } public static void Main(string[] args) { int[] a = {0, 1, 2, 1}; int[] b = {0, 1, 2, 1}; int[] c = {0, 1, 1, 2}; Console.WriteLine(AreElementsEqual(a, b)); // 输出 True Console.WriteLine(AreElementsEqual(a, c)); // 输出 True } }
方案3:LINQ分组对比
利用LINQ的GroupBy方法对元素分组统计,直接对比两个数组的分组结果是否一致。
using System; using System.Linq; public class ArrayComparer { public static bool AreElementsEqual(int[] arr1, int[] arr2) { if (arr1.Length != arr2.Length) return false; var group1 = arr1.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count()); var group2 = arr2.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count()); // 对比两个字典的键值对是否完全一致 return group1.Count == group2.Count && group1.All(kv => group2.ContainsKey(kv.Key) && group2[kv.Key] == kv.Value); } public static void Main(string[] args) { int[] a = {0, 1, 2, 1}; int[] b = {0, 1, 2, 1}; int[] c = {0, 1, 1, 2}; Console.WriteLine(AreElementsEqual(a, b)); // 输出 True Console.WriteLine(AreElementsEqual(a, c)); // 输出 True } }
内容的提问来源于stack exchange,提问作者kennarddh
相关产品推荐
相关产品推荐

