根据条件在列表中进行筛选和分组

Filtering and grouping in list based on condition

提问人:Sharpeye500 提问时间:11/6/2023 最后编辑:Joel CoehoornSharpeye500 更新时间:11/7/2023 访问量:83

问:

我有一个具有属性的列表对象

[
   {
      "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。Idrecord.LastestValuerecord.LastestValue

预期结果:

[
   {
      "Id": 123,
      "Name": "Admin",
      "Group": 1,
      "OldValue": 0,
      "LastestValue": 1
   },
   {
      "Id": 456,
      "Name": "Worker",
      "Group": 2,
      "OldValue": 0,
      "LastestValue": 1
   }
]
列出 vb.net LINQ

评论

0赞 Yong Shun 11/6/2023
您的语法 VB.NET。您正在标记 C#,您是否期待用 C# 编写的答案?
0赞 Gert Arnold 11/6/2023
“第一”和“最后”在这里没有明确定义。不要指望保证集合中的原始顺序被保留下来。另外,如果多个相同名称不匹配怎么办?GroupByLatestValue

答:

3赞 Yong Shun 11/6/2023 #1

您正在标记 C#,并假定您正在接受 C# 答案。

在每个组中,您可以添加逻辑来检查第一条和最后一条记录是否相同。这也适用于具有单个记录的组,因为第一条和最后一条记录将引用同一条记录。LastestValue

如果条件未满足,则返回并确保需要删除结果的记录。nullnull

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)
0赞 Yong Shun 11/6/2023
如果在组内,第一条记录和最后一条记录不相同,则应排除数据怎么办?像这样为了 VB.NETLastestValueLastestValue