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

VB.NET非LINQ方式原地按Total属性查找重复分组项

原地处理大型列表重复项的解决方案

方案1:用哈希表跟踪已出现值,低内存遍历处理

LINQ分组会生成大量中间分组对象,导致内存飙升。换成HashSet或Dictionary跟踪已出现的Total值,遍历原列表时直接判断重复,内存开销仅为哈希表本身,远低于LINQ分组。

原地移除重复项(直接修改原列表)

' 根据Total的实际类型调整泛型参数,比如Integer/Double
Dim seenTotals As New HashSet(Of Decimal)
Dim duplicateIndexes As New List(Of Integer)

' 倒序遍历,避免移除元素时索引错乱
For i As Integer = test.Count - 1 To 0 Step -1
    Dim currentTotal = test(i).Total
    ' Add返回False说明该值已存在,标记为重复
    If Not seenTotals.Add(currentTotal) Then
        duplicateIndexes.Add(i)
    End If
Next

' 批量移除重复项
For Each index In duplicateIndexes
    test.RemoveAt(index)
Next

收集所有重复对象(不修改原列表)

Dim totalMap As New Dictionary(Of Decimal, List(Of YourObject))
Dim duplicates As New List(Of YourObject)

For Each item In test
    If totalMap.ContainsKey(item.Total) Then
        ' 首次发现重复时,把之前记录的首个对象也加入重复列表
        If totalMap(item.Total).Count = 1 Then
            duplicates.AddRange(totalMap(item.Total))
        End If
        duplicates.Add(item)
        totalMap(item.Total).Add(item)
    Else
        totalMap.Add(item.Total, New List(Of YourObject) From {item})
    End If
Next

方案2:先原地排序,再查找连续重复项

如果允许修改原列表的顺序,先调用List.Sort做原地排序(.NET的Sort是低内存的原地算法),再遍历相邻元素找重复,几乎不需要额外内存,适合超大型列表。

' 按Total属性原地排序
test.Sort(Function(a, b) a.Total.CompareTo(b.Total))

Dim duplicates As New List(Of YourObject)
Dim i As Integer = 0
While i < test.Count - 1
    Dim currentTotal = test(i).Total
    Dim j As Integer = i + 1
    ' 找到所有连续的相同Total项
    While j < test.Count AndAlso test(j).Total = currentTotal
        duplicates.Add(test(j))
        j += 1
    End If
    ' 如果存在重复,把第一个元素也加入重复列表
    If j > i + 1 Then
        duplicates.Add(test(i))
    End If
    i = j
End While

关键注意点

  • 哈希表的泛型类型必须和Total的类型一致,避免值类型装箱拆箱带来的额外开销
  • 如果原列表是只读的,优先选择哈希表收集重复对象的方案,不要尝试修改原列表
  • 若只需要知道哪些Total值重复,不需要收集对象,直接用HashSet记录重复值即可,内存占用会更低

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:06:21