2012-08-14 131 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());