选择列表linq中的重复项

时间:2012-08-14 07:29:26

标签: .net winforms linq list

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

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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();

答案 2 :(得分:0)

更简单的替代方案是:

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