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

C#中不借助外部函数或库移除对象数组重复元素的问题排查

对象数组去重函数失效的问题分析与修复

核心错误点

  • 对象引用比较而非值比较:值类型(int、bool、double)装箱为object后,==运算符会执行引用比较而非值比较。比如两个值为25的int装箱后是不同的object实例,==会返回false,导致无法识别重复值。
  • 内层循环逻辑错误:原代码用j < i作为循环条件,但unique_arr中只有前k个元素是已添加的去重项,剩余都是null。遍历到null时自然和当前元素不相等,无法正确检测重复,正确条件应为j < k。
  • 输出目标错误:最后控制台输出的是原数组mix_arr,而非去重后的unique_arr,导致你看不到去重结果。

修正后的代码

using System;

namespace MyApp 
{
    internal class Program
    {
        static void Main(string[] args)
        {
            object[] mix_arr = new object[8];
            mix_arr[0] = 25;
            mix_arr[1] = "Anna";
            mix_arr[2] = false;
            mix_arr[3] = 25;
            mix_arr[4] = DateTime.Now;
            mix_arr[5] = 112.22;
            mix_arr[6] = "Anna";
            mix_arr[7] = false;
            object[] unique_arr = new object[8];
            bool isDuplicate = false;
            int uniqueCount = 0;

            for (int i = 0; i < mix_arr.Length; i++)
            {
                isDuplicate = false;
                // 仅遍历已加入去重数组的元素
                for (int j = 0; j < uniqueCount; j++)
                {
                    // 使用Object.Equals处理值类型装箱后的比较
                    if (Object.Equals(unique_arr[j], mix_arr[i]))
                    {
                        isDuplicate = true;
                        break;
                    }                           
                }
                if (!isDuplicate)
                {
                    unique_arr[uniqueCount++] = mix_arr[i];
                }
            }

            // 输出原数组
            Console.Write("原数组: ");
            foreach (var item in mix_arr)
            {
                Console.Write($"{item} ");        
            }
            Console.WriteLine();

            // 输出去重后的数组
            Console.Write("去重后数组: ");
            for (int i = 0; i < uniqueCount; i++)
            {
                Console.Write($"{unique_arr[i]} ");        
            }
            Console.WriteLine();
        }    
    }       
}

关键修正说明

  1. 用Object.Equals()替代==:该方法会自动判断对象类型,对值类型做值比较,对引用类型做引用比较,能正确识别装箱后的重复值。
  2. 内层循环条件改为j < uniqueCount:只检查已经添加到去重数组的有效元素,避免和null比较导致误判。
  3. 新增去重后数组的输出,并仅遍历前uniqueCount个元素,避免输出未赋值的null。

内容的提问来源于stack exchange,提问作者Lee JianXing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:35:39