到目前为止,我有这个:
List<Item> duplicates = items.GroupBy(x => x.Id)
.SelectMany(g => g.Skip(1)).ToList();
List<Item> nonDuplicates = items.GroupBy(x => x.Id)
.Select(x => x.First()).ToList();
有没有更有效的方法可以做到这一点(即一次选择)?
输入示例:
Id Value (added for some perspective)
-- -----
1 12
1 909
1231 0
1 577
示例输出:
duplicates -> {1, 909}, {1, 577}
non-duplicates -> {1, 12}, {1231, 0}
最佳答案
如果您确实想避免实际分组超过一次,从而避免重复多次源序列,则可以对项目进行分组,将查询具体化为一个列表,然后从该列表中获取所需的信息。
var query = items.GroupBy(x => x.id)
.ToList();
var duplicates = query.SelectMany(group => group.Skip(1));
var nonDuplicates = query.Select(group => group.First());
话虽如此,对项目进行分组并不是操作的特别昂贵,因此这实际上并不是一个特别大的胜利。您现有代码“足够好”的赔率相当高。
如果我不确定如果多次重复源序列是否会返回相同的项目,或者如果说
IQueryable
需要对数据库进行往返操作来获取该序列,那么我将对此最感兴趣。项目。在这些情况下,这是值得实施的更改。