删除列表的重复项,选择C#中的属性值?

问题描述:

我有一个对象列表,我需要从中删除一些重复项。我们认为他们重复,如果他们有相同的Id,并且更喜欢booleanValue为false的人。这是我到目前为止有:删除列表的重复项,选择C#中的属性值?

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

我已经确定的GroupBy做没有这样的分组,所以我不看看是否有任何的其它功能工作。对此有何想法?提前致谢。

+0

x.ID是什么类型? – allonhadaya 2013-04-11 01:10:48

+0

@allonhadaya这是一个整数。 – 2013-04-11 14:08:40

你可以这样做:

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

对于每一个Id发现在objects,将选择的第一要素,其中booleanValue == false,还是第一个(如果他们都没有booleanValue == false)。

如果你喜欢流畅的语法:

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

我更喜欢流利的语法。 :) 谢谢。作为发现这一点的其他人的附注,我在最后一个括号后面加了“.ToList()”,并设置了“objects =”而不是“var results =”。这样,我可以对列表进行永久性更改。 – 2013-04-11 14:17:31

+1

@ p.s.w.g如果我不想删除所有重复项,但总是在列表中留下一个,该怎么办? – Obsivus 2015-01-13 13:43:20

+0

我试过了,但它不适用于我的对象列表。我仍然得到重复返回。请参阅我的问题:http://*.com/questions/42316343/groupby-to-remove-duplicates-from-ienumerable-list-of-objects – naz786 2017-02-20 13:42:54

像这样的东西应该工作:

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

这是假设你的对象是引用类型。

另一种可能性是使用Distinct()自定义IEqualityComparer<>