2013-04-11 111 views
1

我有一個對象列表,我需要從中刪除一些重複項。我們認爲他們重複,如果他們有相同的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

回答

3

你可以這樣做:

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://stackoverflow.com/questions/42316343/groupby-to-remove-duplicates-from-ienumerable-list-of-objects – naz786 2017-02-20 13:42:54

0

像這樣的東西應該工作:

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

這是假設你的對象是引用類型。

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