c# - 将列表拆分为重复列表和非重复列表

标签 c# linq

到目前为止我有这个:

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/

相关文章:

c# - 处置 StringBuilder 对象

c# - c#中contains和contains<>的区别

c# - Null 合并在 LINQ 查询中不起作用

c# - 非静态字段、方法或属性需要对象引用

c# - 启动画面关闭后,表单将在后台打开

C# - 将数据传递给 JS 并等待结果进行处理

c# - Doxygen C# 代码片段示例生成

c# - 会不会出现垃圾回收器因为异常而无法运行的场景?

c# - 如何使用 LINQ 获取值(value)最低的项目?

database - 没有 Linq 时像 Linq 一样查询