【问题标题】:Remove duplicates of a List, selecting by a property value in C#?删除列表的重复项,通过 C# 中的属性值进行选择?
【发布时间】:2013-04-11 00:53:40
【问题描述】:

我有一个对象列表,我需要从中删除一些重复项。如果它们具有相同的 ID,我们认为它们是重复的,并且更喜欢 booleanValue 为 false 的 ID。到目前为止,这是我所拥有的:

objects.GroupBy(x => x.Id).Select(x => x.Where(y => !y.booleanValue));

我已确定 GroupBy 没有进行此类分组,因此我看不出其他任何功能是否正常工作。对此有什么想法吗?提前致谢。

【问题讨论】:

  • x.ID的类型是什么?
  • @allonhadaya 这是一个整数。

标签: c# linq list duplicates


【解决方案1】:

你可以这样做:

var results = 
    from x in objects
    group x by x.Id into g
    select g.OrderBy(y => y.booleanValue).First();

对于在objects 中找到的每个Id,它将选择booleanValue == false 所在的第一个元素,或者第一个元素(如果它们都没有booleanValue == false)。

如果你喜欢流畅的语法:

var results = objects.GroupBy(x => x.Id)
                     .Select(g => g.OrderBy(y => y.booleanValue).First());

【讨论】:

  • 我更喜欢流利的语法。 :) 谢谢。作为发现此问题的其他人的旁注,我在最后一个括号后添加了“.ToList()”,并设置了“objects =”而不是“var results =”。这样我就可以对列表进行永久性更改。
  • @p.s.w.g 如果我不想删除所有重复项但总是在列表中留下一个怎么办?
  • 我试过这个,但它不适用于我的对象列表。我仍然收到重复的返回。请看我的问题:stackoverflow.com/questions/42316343/…
【解决方案2】:

这样的事情应该可以工作:

var result =
    objects.GroupBy(x => x.Id).Select(g =>
        g.FirstOrDefault(y => !y.booleanValue) ?? g.First())

这假定您的对象是引用类型。

另一种可能是将Distinct() 与自定义IEqualityComparer<> 一起使用。

【讨论】:

    猜你喜欢
    • 2019-08-04
    • 2023-02-13
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2015-08-06
    • 2017-05-28
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多