提问人:Sharpeye500 提问时间:11/6/2023 最后编辑:Joel CoehoornSharpeye500 更新时间:11/7/2023 访问量:83
根据条件在列表中进行筛选和分组
Filtering and grouping in list based on condition
问:
我有一个具有属性的列表对象
[
{
"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
Dim result = myList.GroupBy(Function(i) i.Name).Where(Function(p) p.Count >1).SelectMany(Function(k) k).ToList()
但是按照上述方式操作,我错过了:456 个值。我想过滤掉条目并进行条件检查,对于像“Admin”这样的名称,如果它们匹配,我想比较它的第一个和最后一个,保存最后一个记录项条目并忽略其他任何内容,并保留没有名称的记录计数> 1。Id
record.LastestValue
record.LastestValue
预期结果:
[
{
"Id": 123,
"Name": "Admin",
"Group": 1,
"OldValue": 0,
"LastestValue": 1
},
{
"Id": 456,
"Name": "Worker",
"Group": 2,
"OldValue": 0,
"LastestValue": 1
}
]
答:
3赞
Yong Shun
11/6/2023
#1
您正在标记 C#,并假定您正在接受 C# 答案。
在每个组中,您可以添加逻辑来检查第一条和最后一条记录是否相同。这也适用于具有单个记录的组,因为第一条和最后一条记录将引用同一条记录。LastestValue
如果条件未满足,则返回并确保需要删除结果的记录。null
null
var result = myList.GroupBy(x => x.Name)
.Select(g => new
{
Name = g.Key,
Data = g.First().LastestValue == g.Last().LastestValue
? g.Last()
: null
})
.Select(x => x.Data)
.Where(x => x != null)
.ToList();
对于 VB.NET 它应该是:
Dim result = myList.GroupBy(Function(x) x.Name).Select(
Function(g) New With {
Key.Name = g.Key,
Key.Data = If(g.First().LastestValue = g.Last().LastestValue, g.Last(), Nothing)
}).Select(Function(x) x.Data).Where(Function(x) x IsNot Nothing).ToList()
评论
0赞
Yong Shun
11/6/2023
演示 @ .NET Fiddle
0赞
Yong Shun
11/6/2023
演示 (VB.NET) @ .NET Fiddle
0赞
Sharpeye500
11/6/2023
[ { “”Id“”: 123, “”Name“”: “admin”“, ”Group“”: 1, “”OldValue“”: 0, “”LastestValue“”: 1 }, {“”Id“”: 123, “”Name“: ”Admin“”, “Group”“: 1, ”“OldValue”“: 1, ”“LastestValue”“: 0 }, {”“Id”“: 123, ”“Name”“: ”admin“”, “”Group“”: 1, “”OldValue“: 1, ”“LastestValue”“: 1 }, {”“Id”“: 456, ”“Name”“: ”Worker“”, “Group”“: 2, ”“OldValue”“: 0, ”“LastestValue”“: 1 }]”;预期结果:是 123 和 456 项(2 项)的最后一个元素
0赞
Sharpeye500
11/6/2023
谢谢,如果有多个项目,它就做不好。循环相同的名称,比较第一个元素。LatestValue == 最后一个元素。LatestValue,如果两者都相等,则取最后一个元素(忽略其他元素)并包含未分组的元素(单个名称)。例如:带有 Admin 的名称可以有多个项目,类似地,带有 Tester 的名称可以有多个项目,如果其 (admin.firstRecord.Latest=admin.lastRecordLatest),则所有项目都应该提取最后一项,类似地为 (tester.firstRecord.Latest=tester.lastRecordLatest)
评论
GroupBy
LatestValue