删除列表的重复项,选择C#中的属性值?
我有一个对象列表,我需要从中删除一些重复项。我们认为他们重复,如果他们有相同的Id,并且更喜欢booleanValue为false的人。这是我到目前为止有:删除列表的重复项,选择C#中的属性值?
objects.GroupBy(x => x.Id).Select(x => x.Where(y => !y.booleanValue));
我已经确定的GroupBy做没有这样的分组,所以我不看看是否有任何的其它功能工作。对此有何想法?提前致谢。
你可以这样做:
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());
我更喜欢流利的语法。 :) 谢谢。作为发现这一点的其他人的附注,我在最后一个括号后面加了“.ToList()”,并设置了“objects =”而不是“var results =”。这样,我可以对列表进行永久性更改。 – 2013-04-11 14:17:31
@ p.s.w.g如果我不想删除所有重复项,但总是在列表中留下一个,该怎么办? – Obsivus 2015-01-13 13:43:20
我试过了,但它不适用于我的对象列表。我仍然得到重复返回。请参阅我的问题:http://stackoverflow.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<>
。
x.ID是什么类型? – allonhadaya 2013-04-11 01:10:48
@allonhadaya这是一个整数。 – 2013-04-11 14:08:40