2010-01-22 53 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();