2012-08-14 141 views
1

我需要使用linq从列表中选择重复项,并返回阵列中包含重复项的每个数组的列表。例如,如果我的列表是在列表中选择重复项linq

{2,2,3,13,4,4,15,5,7,8,9,12,13} 

然后,我需要回到

{2,2},{4,4} 

下面的代码只返回每个单个值复制

int[] listOfItems = new[] {2,2,3,13,4,4,15,5,7,8,9,12,13}; 
var duplicates = listOfItems 
    .GroupBy(i => i) 
    .Where(g => g.Count() > 1) 
    .Select(g => g.Key); 
foreach (var d in duplicates) 
    Console.WriteLine(d); 

这将产生以下:

​​3210

回答

5

嗯,这就是问题所在:

.Select(g => g.Key) 

你明确只是选择的关键。

删除该呼叫,您将选择所有组 - 您将获得IEnumerable<IGrouping<int, int>>。当然,您还需要更改输出。例如:

foreach (var group in duplicates) 
{ 
    Console.WriteLine("{{{0}}}", group.Join(",")); 
} 

编辑:对于List<int[]>你只需要:

var duplicates = listOfItems 
    .GroupBy(i => i) 
    .Where(g => g.Count() > 1) 
    .Select(g => g.ToArray()) 
    .ToList(); 
+0

感谢,反而会这个数组的返回列表? – Smith 2012-08-14 07:42:06

+0

@史密斯:不,它会返回一系列“IGrouping”组。将编辑,以获得您的阵列列表... – 2012-08-14 07:45:04

+0

@Downvoter:照顾评论? – 2012-08-14 07:48:23

2

刚刚摆脱.Select(g => g.Key)行的,你就会有本质上,嵌套可枚举。

int[] listOfItems = new[] {2,2,3,13,4,4,15,5,7,8,9,12,13}; 
var duplicates = listOfItems 
    .GroupBy(i => i) 
    .Where(g => g.Count() > 1); 

foreach (var g in duplicateGroups) 
{ 
    foreach (var d in g) 
    { 
     Console.WriteLine(d); 
    } 
    Console.WriteLine(); 
} 

如果你想阵列的列表,你会想

var listOfArrays = duplicates.Select(g => g.ToArray()).ToList(); 

同样

var listOfLists = duplicates.Select(g => g.ToList()).ToList(); 
var arrayOfLists = duplicates.Select(g => g.ToArray()).ToList(); 
var arrayOfArrays = duplicates.Select(g => g.ToArray()).ToArray(); 
+0

谢谢,但是这会返回数组列表吗? – Smith 2012-08-14 07:42:13

+0

查看更新,如果你真的想要''''List''''。 ('List ')但是,如果你要做的只是通过它们的foreach,那么它是一个数组列表还是一个列表数组,或者是一个'IGrouping'的IEnumerable并不重要秒。 – Rawling 2012-08-14 07:45:52

0

一个更简单的方法是这样的:

listOfItems 
    .ToLookup(x => x) 
    .Where(x => x.Skip(1).Any());