到目前为止,我有这个:

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需要对数据库进行往返操作来获取该序列,那么我将对此最感兴趣。项目。在这些情况下,这是值得实施的更改。

08-28 12:06