我想使用linq使用值对数据进行分组,并将相应的索引作为数组返回。
示例
int[] input = {0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,2,2,2,2}
预期输出
Dictionary<int,int[]> ouput = {0->[0,1,2,3,8,9,10,11]; 1 -> [4,5,6,7,12,13,14,15]; 2 -> [16,17,18,19]}
有人可以指导我吗?
答案 0 :(得分:5)
您可以使用:
var output = input.Select((x, i) => new { Value=x, Index=i })
.GroupBy(x => x.Value)
.ToDictionary(x => x.Key, x => x.Select(y => y.Index)
.ToArray());
首先选择一个匿名类型来保存数组中的原始索引,然后按值进行分组,然后将分组结果转换为字典,其中每个组的键作为字典的键,并且来自所有元素。相应的组选择了索引。
更短的方式是:
var output2 = input.Select((x, i) => new { Value=x, Index=i })
.ToLookup(x => x.Value, x => x.Index);
这将导致Lookup<int, int>
在语义上与Dictionary<int, int[]>
相同。
答案 1 :(得分:4)
var result = input
.Select((i, index) => new{Num=i, Index=index})
.GroupBy(x => x.Num)
.ToDictionary(grp => grp.Key, grp => grp.Select(x => x.Index).ToArray());
答案 2 :(得分:0)
尝试
input.Select( (i, index) => new {Value = i, Index = index})
.GroupBy(x => x.Value).Select(y => new { Key = y.Key, Indexes = y.Select(z => z.Index).ToList() });