List中根据条件过滤分组

问题描述 投票:0回答:1

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

[{
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# list vb.net vb.net-2010
1个回答
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()
© www.soinside.com 2019 - 2024. All rights reserved.