到目前为止我有这个:
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
需要执行以下操作,那么我最感兴趣的是这样做往返数据库以获取项目。在这些情况下,这是值得实现的更改。
关于c# - 将列表拆分为重复列表和非重复列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22053554/