2012-04-18 167 views
0

我想使用linq將數據分組使用值並將相應的索引作爲數組返回。Groupby值和返回索引

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

嗯..什麼是挑選邏輯? – Tigran 2012-04-18 12:02:33

回答

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[]>

+0

你贏了一分鐘... – Carsten 2012-04-18 12:07:13

+0

什麼是數據聚合背後的邏輯? – Tigran 2012-04-18 12:07:30

+0

@Tigran:你的意思是什麼?也許它已經在擴展答案中得到了答案? – 2012-04-18 12:09:10

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() }); 
+0

這會產生預期的結果嗎? – Tigran 2012-04-18 12:04:00

+0

@Tigran:這將返回正確的結果,但不是字典而是「IEnumerable 」。 – 2012-04-18 12:18:08

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()); 
+0

謝謝Tim!很高興再次見到你:-) – Suresh 2012-04-18 12:48:05