如何使用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
实现思路说明
- 分组筛选:用LINQ的
GroupBy按Code聚合所有行,再用Where过滤出需要处理的分组(行数大于1且Code非空),这一步比原代码多次查询DataTable高效得多。 - 基准版本获取:以每组第一行的Version为基准,确保后续版本递增的起始值正确。
- 索引递增:给组内每行添加索引,根据索引值递增版本号的最后一段,保证版本号按顺序连续。
- 更新数据:因为DataRow是引用类型,修改后会直接反映到原DataTable中,无需额外的赋值操作。
这个实现不仅逻辑更清晰,还减少了不必要的表查询操作,性能更优。
内容的提问来源于stack exchange,提问作者Nani
相关产品推荐
相关产品推荐

