我有一个带有属性的列表对象
[{
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
}]
我能够根据名称提取数据。
Dim result = myList.GroupBy(Function(i) i.Name).Where(Function(p) p.Count >1).SelectMany(Function(k) k).ToList()
但是按照上述方式我错过了 Id: 456 值。我想过滤掉条目并进行条件检查,对于像 Admin 这样的名称,我想比较其第一条记录。LatestValue 与最后一条记录。LatestValue 如果匹配,则保存最后一条记录项条目并忽略其他任何内容,并保留名称计数不大于 1 的记录。
预期结果:
[{Id: 123,
Name: 'Admin',
Group: 1,
OldValue: 0,
LastestValue: 1
},
{Id: 456,
Name: 'Worker',
Group: 2,
OldValue: 0,
LastestValue: 1
}]
您正在标记 C# 并假设您正在接受 C# 答案。
您应该需要一个嵌套分组来按
LastestValue
进行分组,并在每个嵌套组中获取最后一条记录。
var result = myList.GroupBy(x => x.Name)
.Select(g => new
{
Name = g.Key,
Data = g.GroupBy(x => x.LastestValue)
.Select(x => x.Last())
.ToList()
})
.SelectMany(x => x.Data)
.ToList();
对于 VB.NET 应该是:
Dim result = myList.GroupBy(Function(x) x.Name).Select(
Function(g) New With {
Key.Name = g.Key,
Key.Data = g.GroupBy(Function(x) x.LastestValue).Select(Function(x) x.Last()).ToList()
}).SelectMany(Function(x) x.Data).ToList()