【问题标题】:How to remove non-duplicates from a list in C#如何从 C# 中的列表中删除非重复项
【发布时间】:2011-11-10 14:51:30
【问题描述】:

我想做与here相反的事情

我有一个列表,我知道如何删除重复项。但我想有一个选项,用户可以选择保留哪个副本。一些查询查询我可以有一个只显示重复项的列表。比如:

假设我的清单是:

“汤姆”“鲍勃”“弗兰克”“鲍勃”“莱西”“弗兰克”

我知道如果我使用 distinct 方法,我会得到:

“汤姆”“鲍勃”“弗兰克”“莱西”

我不知道我必须使用什么方法来获取:

“鲍勃”“鲍勃”“坦率”“坦率”

或得到

“鲍勃”“坦率”

因为那些是重复的。

【问题讨论】:

  • 按名称分组,计数 > 1
  • 换句话说,当您单击显示重复歌曲的选项时,我想做与 iTunes 相同的操作。
  • @Joe:您的回答与提出的问题完美匹配。您为什么不将其发布为答案以允许 OP 批准它?
  • @Sylverdrag 我不太了解 LINQ,无法提供足够的答案

标签: c# linq


【解决方案1】:

您可以使用GroupBy 过滤掉只出现一次的项目,然后将剩余的项目展平成一个列表:

var resultList = list.GroupBy(x => x)
                     .Where(g => g.Count() > 1)
                     .SelectMany(g => g)
                     .ToList();

【讨论】:

  • 此外,对于 IEnumerable 的一般情况,当有大量重复项时,您可以使用 .Where( g=> g.Skip(1).Any()) 而不是上面的 Where 条件,效率会更高。
  • 为什么我们需要在 Where 条件之后使用 SelectMany?我是 Linq 的新手,请帮助我理解这一点。
  • @Sandeep:SelectMany 将列表列表“展平”为单个列表,其中包含原始列表中包含的所有元素
【解决方案2】:

我需要通过特定属性来比较它们,然后我才将您的查询 BrokenGlass 修改为

var resultList = itemsThatNeedToBeAdded.GroupBy(x => x.property1)
                     .Where(g => g.Count() > 1 )
                     .SelectMany(g => g)
                     .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 2017-11-24
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多