我有一個對象列表,我需要從中刪除一些重複項。我們認爲他們重複,如果他們有相同的Id,並且更喜歡booleanValue爲false的人。這是我到目前爲止有:刪除列表的重複項,選擇C#中的屬性值?
objects.GroupBy(x => x.Id).Select(x => x.Where(y => !y.booleanValue));
我已經確定的GroupBy做沒有這樣的分組,所以我不看看是否有任何的其它功能工作。對此有何想法?提前致謝。
我有一個對象列表,我需要從中刪除一些重複項。我們認爲他們重複,如果他們有相同的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