2010-01-22 50 views
1

我有一個包含具有groupnumber屬性的對象的IEnumerable。我希望能夠獲得所有具有重複組號的對象的列表,例如保持重複

OBJ1:groupnumber = 1 KEEP
OBJ 2:groupnumber = 2刪除
OBJ 3:groupnumber = 1 KEEP

我可以使用以下方法來獲取所有重複groupnumbers列表

var duplicates = from c in sorted 
        group c by c.groupnumber into g 
        where g.Count() > 1 
        select new { groupnumber = g.Key, recs = g.Count() }; 

但我無法弄清楚如何得到一個列表清除所有的單個實例對象

乾杯

回答

1

好吧,我不得不讀你的問題了幾次。我的理解是,你要「選擇集合中具有多個obj的所有objs,並使用相同的groupnumber」......所以要篩選出具有唯一組號的那些obj。

如果是這樣的話,你幾乎就在那裏!使用SelectMany可以將這些組合併到一個集合中。

var duplicates = (from c in sorted 
    group c by c.groupnumber into g 
    where g.Count() > 1 
    select g).SelectMany(grp => grp); 
+0

謝謝,我才發現他下面這炒菜,靠近你 VAR欺騙=從dr in排序 group dr由dr.groupnumber分組爲 from dr in groupped.Skip(1) select dr; – 2010-01-22 05:39:01

+0

我認爲只有偶然的作品(第一組可能是沒有重複的組)。你一定要保留你之前的「where」條款。 :) – Sapph 2010-01-22 05:41:07

1

這裏是最簡單的選擇(我認爲):

sorted.GroupBy(c => c.groupnumber) 
     .Where(g => g.Count() > 1) 
     .SelectMany(g => g); 

或者,請嘗試以下操作:

var duplicates = from c in sorted 
       group c by c.groupnumber into g 
       where g.Count() > 1 
       select g.Key; 

// convert the list to a lookup object for efficiency 
var dupLookup = duplicates.ToLookup(c => c); 

// exclude all items that are NOT one of the duplicate group keys 
var excludeNonDups = sorted.Where(c => !dupLookup.Contains(c)) 
0

添加到一個呼叫鮮明的(),如果你只希望每個副本中的一個:

var duplicates = (from c in sorted 
        group c by c.groupnumber into g 
        where g.Count() > 1 
        select new { groupnumber = g.Key, recs = g.Count() }).Distinct();