2

我需要使用 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);

这会产生以下结果:

4
2
4

3 回答 3

6

好吧,这就是问题所在:

    .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();
于 2012-08-14T07:32:21.367 回答
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();
于 2012-08-14T07:32:40.253 回答
0

一个更简单的替代方案是:

listOfItems
    .ToLookup(x => x)
    .Where(x => x.Skip(1).Any());
于 2012-08-14T07:58:05.983 回答