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

如何使用LINQ实现按Code分组的重复Version列值递增替换?

使用LINQ替代VB.NET循环实现版本号递增

需求概述

我们需要将重复Code对应的Version字段按顺序递增,原始数据如下:

Code ------ Version
AAA ------ 0.0.0.0
AAA ------ 0.0.0.1
AAA ------ 0.0.0.1
AAA ------ 0.0.0.1
AAA ------ 0.0.0.1
BBB ------ 0.0.0.0
CCC ------ 0.0.0.0
CCC ------ 0.0.0.0

转换后目标数据:

Code ------ Version
AAA ------ 0.0.0.0
AAA ------ 0.0.0.1
AAA ------ 0.0.0.2
AAA ------ 0.0.0.3
AAA ------ 0.0.0.4
BBB ------ 0.0.0.0
CCC ------ 0.0.0.0
CCC ------ 0.0.0.1

原VB.NET循环实现

你当前使用的循环代码如下:

For Each row As DataRow In duplicateEntityRecords.Rows
    Dim strkey = row(0).ToString
    foundrows = dataObject.Tables("tables").Select("version= '" & strkey & "'")
    If foundrows.Length > 1 AndAlso Not strkey.Equals(String.Empty) Then
        Dim increment As String = "1"
        For i As Integer = 1 To foundrows.GetUpperBound(0)
            foundrows(i)("friendlyname") = foundrows(i)("friendlyname") + increment
            increment = increment + 1
        Next
    End If
Next

LINQ实现方案

当然可以用LINQ来完成这个任务!LINQ的分组功能可以帮我们更高效地按Code聚合数据,避免原代码中每次循环都查询DataTable的开销。以下是具体实现:

' 将DataRow集合转换为可枚举序列,方便LINQ操作
Dim rows = duplicateEntityRecords.Rows.Cast(Of DataRow)()

' 按Code分组,过滤出需要处理的组(行数>1且Code不为空)
Dim codeGroups = rows.GroupBy(Function(row) row(0).ToString())
                     .Where(Function(group) group.Count() > 1 AndAlso Not String.IsNullOrEmpty(group.Key))

' 遍历每个分组,更新Version字段
For Each group In codeGroups
    ' 获取组内第一行的Version作为基准,拆分版本号
    Dim baseVersionParts = group.First()("Version").ToString().Split("."c)
    If baseVersionParts.Length <> 4 Then Continue For ' 确保是合法的四段式版本号

    ' 给组内每行添加索引,按原始顺序处理
    Dim indexedRows = group.Select(Function(row, index) New With { .Row = row, .Index = index }).ToList()

    For Each item In indexedRows
        ' 第一行保持原版本,从第二行开始递增最后一位
        If item.Index > 0 Then
            Dim newLastPart = Integer.Parse(baseVersionParts(3)) + item.Index
            baseVersionParts(3) = newLastPart.ToString()
            item.Row("Version") = String.Join(".", baseVersionParts)
        End If
    Next
Next

实现思路说明

  1. 分组筛选:用LINQ的GroupBy按Code聚合所有行,再用Where过滤出需要处理的分组(行数大于1且Code非空),这一步比原代码多次查询DataTable高效得多。
  2. 基准版本获取:以每组第一行的Version为基准,确保后续版本递增的起始值正确。
  3. 索引递增:给组内每行添加索引,根据索引值递增版本号的最后一段,保证版本号按顺序连续。
  4. 更新数据:因为DataRow是引用类型,修改后会直接反映到原DataTable中,无需额外的赋值操作。

这个实现不仅逻辑更清晰,还减少了不必要的表查询操作,性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:39:25