在列表中选择重复项linq
问题描述:
我需要使用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
答
嗯,这就是问题所在:
.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();
答
刚刚摆脱.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();
答
一个更简单的方法是这样的:
listOfItems
.ToLookup(x => x)
.Where(x => x.Skip(1).Any());
感谢,反而会这个数组的返回列表? – Smith 2012-08-14 07:42:06
@史密斯:不,它会返回一系列“IGrouping”组。将编辑,以获得您的阵列列表... – 2012-08-14 07:45:04
@Downvoter:照顾评论? – 2012-08-14 07:48:23