.NET 7中如何将ArrayList的Object数组转为int[]并实现数组去重?
问题:ArrayList中Object数组转int[]并实现去重比较
我从System.Collections.ArrayList中提取了一个Object类型的数组,现在需要将其转换为int[],以便与另一个int[]进行比较。当前使用的是.NET Framework 7.0.0。
我的代码如下:
var query = (from el in l where el.ID_Seal_From != "" && el.ID_Seal_From != null select new { conn = el.Conn_from, seal = el.ID_Seal_From }).ToList(); var query2 = (from el in l where el.ID_Seal_To != "" && el.ID_Seal_To != null select new { conn = el.Conn_to, seal = el.ID_Seal_To }).ToList(); var res = query.Concat(query2).ToList(); ArrayList arrLi = new(); List<int> indexOfEqualElements = new(); for (int i = 0; i < res.Count; i++) { for (int j = 0; j < res.Count; j++) { if (res[i].seal.CompareTo(res[j].seal) == 0) { indexOfEqualElements.Add(j); } } if (Contains(arrLi, indexOfEqualElements.ToArray()) == -1) //to avoid multiple entries { arrLi.Add(indexOfEqualElements.ToArray()); } indexOfEqualElements.Clear(); }
需求说明:在Contains调用中,我需要比较数组的内容,避免向列表中添加重复的数组,以便后续使用去重后的数据集。
解决方案
核心问题分析
- 非泛型集合的弊端:.NET 7中没必要使用
ArrayList,它是非泛型集合,存储的是Object类型,后续提取时需要强制转换,既不安全又影响性能,建议直接用List<int[]>替代。 - 数组默认比较逻辑:数组默认是引用比较,直接用
Contains只会判断两个数组是否为同一引用,而非内容是否相同,这是你无法正确去重的关键。
优化方案(推荐)
利用LINQ的GroupBy直接按seal分组,自动得到每个seal对应的索引数组,且天然去重,代码更简洁高效:
// 合并查询并过滤空值(可简化为单个查询) var res = query.Concat(query2).ToList(); // 按seal分组,提取每组对应的索引并转为int[] var uniqueIndexGroups = res .Select((item, index) => new { item.seal, index }) .GroupBy(x => x.seal) .Select(group => group.Select(g => g.index).ToArray()) .ToList();
这样uniqueIndexGroups就是去重后的List<int[]>,完全不需要手动嵌套循环和重复判断。
手动判断去重的实现(保留原有逻辑场景)
如果必须保留手动判断的逻辑,需要实现数组内容的比较方法:
// 判断ArrayList中是否存在内容相同的int[] private static bool HasMatchingArray(ArrayList arrayList, int[] targetArray) { foreach (var element in arrayList) { if (element is int[] existingArray && existingArray.SequenceEqual(targetArray)) { return true; } } return false; }
然后修改原代码中的判断逻辑:
if (!HasMatchingArray(arrLi, indexOfEqualElements.ToArray())) { arrLi.Add(indexOfEqualElements.ToArray()); }
额外优化点
原代码中的空值判断可以调整为更严谨的写法:
// 先判断null,再判断空字符串,避免空引用异常 where el.ID_Seal_From != null && !string.IsNullOrEmpty(el.ID_Seal_From)
内容的提问来源于stack exchange,提问作者EliTheKing
相关产品推荐
相关产品推荐

