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

如何在忽略元素索引的情况下判断两个C#数组是否相同?

判断两个数组是否由相同元素组成(值与数量一致,顺序无关)

原代码的问题

原代码的判断逻辑存在两个核心问题:

  1. 用==比较数组是比较引用地址,而非数组内容,所以a == b和a == c永远为false(除非是同一个数组实例)。
  2. 按索引逐个比较的方式,只能判断顺序完全相同的数组,无法识别元素组成一致但顺序不同的情况(比如示例中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:53:07