如何在DataTable中多条件筛选重复PartNo并获取对应Id值
如何筛选符合多条件的重复行并获取Id?
嘿,作为新手能写出初始的LINQ代码已经很棒啦!咱们一步步把它扩展成你需要的功能~
你的需求很明确:要从DataTable里找出Group列值为Assembly或Part,同时PartNo存在重复的行,最终获取这些行的Id。原代码只找出了重复的PartNo,但没考虑Group过滤,也没返回对应的Id,咱们来调整逻辑:
完整实现代码
' 筛选符合条件的重复行并提取Id Dim duplicateIds = From row In DT.AsEnumerable() ' 第一步:过滤Group为Assembly或Part的行 Where row.Field(Of String)("Group") = "Assembly" OrElse row.Field(Of String)("Group") = "Part" ' 第二步:按PartNo分组 Group row By partNo = row.Field(Of String)("PartNo") Into Group ' 第三步:只保留分组内行数>1的(即PartNo重复的分组) Where Group.Count() > 1 ' 第四步:从每个分组中提取所有行的Id Select ids = Group.Select(Function(r) r.Field(Of Integer)("Id")) ' 最后:把多个分组的Id合并成一个扁平集合 Select Many ids ' 遍历输出结果 For Each id In duplicateIds Debug.Print(id.ToString()) Next
代码逻辑拆解
我给你拆解每一步的作用,方便理解:
- 过滤Group条件:
Where语句先把Group列是Common的行排除,只留下我们关心的Assembly和Part行。 - 按PartNo分组:把过滤后的行按
PartNo归类,同一个PartNo的行会被放在一个分组里。 - 筛选重复分组:只保留分组内行数大于1的,也就是
PartNo在符合Group条件的行里重复出现的分组。 - 提取并合并Id:从每个合格的分组里提取所有行的Id,再用
Select Many把分散的Id集合合并成一个可直接遍历的扁平集合。
验证示例数据
用你给出的示例表格测试这段代码,输出的Id正好是1、3、5、6、8,完全符合你的预期!
注意:如果你的
Id列数据类型不是Integer,记得把r.Field(Of Integer)("Id")改成对应的类型(比如Of String)。
内容的提问来源于stack exchange,提问作者norbre
相关产品推荐
相关产品推荐

