基于条件的列表筛选与分组:保留指定记录的技术实现
列表数据的分组筛选处理
原始数据
[ { "Id": 123, "Name": "Admin", "Group": 1, "OldValue": 2, "LastestValue": 1 }, { "Id":123, "Name": "Admin", "Group": 1, "OldValue": 0, "LastestValue": 1 }, { "Id": 456, "Name": "Worker", "Group": 2, "OldValue": 0, "LastestValue": 1 } ]
现有代码问题
当前代码仅提取了Name重复的记录,会漏掉Name唯一的条目(如Id=456的记录),无法满足需求:
Dim result = myList.GroupBy(Function(i) i.Name).Where(Function(p) p.Count >1).SelectMany(Function(k) k).ToList()
需求逻辑
- 按
Name对列表进行分组 - 分组后记录数大于1的项:对比组内第一条和最后一条记录的
LastestValue,若二者相等,仅保留组内最后一条记录 - 分组后仅含单条记录的项:直接保留该记录
解决方案代码
Dim result = myList.GroupBy(Function(i) i.Name).Select(Function(group) ' 处理单条记录的分组 If group.Count() = 1 Then Return group.First() Else ' 提取第一条和最后一条的LastestValue Dim firstLastestVal = group.First().LastestValue Dim lastLastestVal = group.Last().LastestValue ' 若值匹配则返回最后一条记录 If firstLastestVal = lastLastestVal Then Return group.Last() End If ' 若值不匹配,可根据实际需求补充处理逻辑,此处返回Nothing后续过滤 Return Nothing End If )' 过滤掉可能的空项 .Where(Function(item) item IsNot Nothing).ToList()
期望结果
[ { "Id": 123, "Name": "Admin", "Group": 1, "OldValue": 0, "LastestValue": 1 }, { "Id": 456, "Name": "Worker", "Group": 2, "OldValue": 0, "LastestValue": 1 } ]
内容的提问来源于stack exchange,提问作者Sharpeye500
相关产品推荐
相关产品推荐

