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(); } } }
关键修正说明
- 用
Object.Equals()替代==:该方法会自动判断对象类型,对值类型做值比较,对引用类型做引用比较,能正确识别装箱后的重复值。 - 内层循环条件改为
j < uniqueCount:只检查已经添加到去重数组的有效元素,避免和null比较导致误判。 - 新增去重后数组的输出,并仅遍历前
uniqueCount个元素,避免输出未赋值的null。
内容的提问来源于stack exchange,提问作者Lee JianXing
相关产品推荐
相关产品推荐

