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