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

.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调用中,我需要比较数组的内容,避免向列表中添加重复的数组,以便后续使用去重后的数据集。


解决方案

核心问题分析

  1. 非泛型集合的弊端:.NET 7中没必要使用ArrayList,它是非泛型集合,存储的是Object类型,后续提取时需要强制转换,既不安全又影响性能,建议直接用List<int[]>替代。
  2. 数组默认比较逻辑:数组默认是引用比较,直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:15:51