2014-09-05 97 views
1

我想將兩個列表組合在一起,但僅限於linq語句。沒有額外的變量或循環。使用LINQ按索引分組的兩個列表

IEnumerable<string> keys = new List<string>() { "A", "B", "C", "A", "B", "C", "D" }; 
IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C", "Val A", "Val B", "Val C", "Val D" }; 

結果應該是這樣的:

    • 纈氨酸A,纈氨酸甲
    • 纈氨酸B,纈氨酸乙
  • ç
    • 瓦爾C,瓦爾ç
  • d
    • 的Val d

我試過.ToLookup(),但我從來沒有使用之前,所以我卡住。

如何通過使用linq來實現這一點。

+0

結果是什麼類型? – 2014-09-05 09:10:13

+0

@TimSchmelter它應該是一個關鍵和值分組thingy – 2014-09-05 09:14:56

回答

1

這應該工作:

keys.Select((k, idx) => new { k , idx }) 
.GroupBy(x => x.k) 
.ToDictionary(g => g.Key, g => g.Select(x => values.ElementAt(x.idx)); 

如果你把值到列表或數組這可能是更有效的,那麼你可以使用索引代替ElementAt

+0

@devhedgehog其實我認爲你是錯的。 – Rawling 2014-09-05 09:25:32

+0

這很好:) – 2014-09-05 09:30:27

-1
IDictionary<string, IEnumerable<string>> result = 
    keys.Distinct().ToDictionary(x => x, key => values.Where(value => value.EndsWith(key))); 
+0

它應該基於索引號而不是內容 – 2014-09-05 09:22:43

3

另一種選擇,也就是不爲O(n^2):

var grouped = keys 
    .Zip(values, (k, v) => new { k, v }) 
    .GroupBy(kvp => kvp.k) 
    .ToDictionary(g => g.Key, g => g.Select(kvp => kvp.v)); 

注意,字典將不保留鍵的順序;你可以用這個來代替,如果你寧願:

var grouped = keys 
    .Zip(values, (k, v) => new { k, v }) 
    .GroupBy(kvp => kvp.k, kvp => kvp.v); 

這將讓你通過的順序它們出現在輸入鍵重複,在不能夠通過一鍵查找的代價。

-1
 IEnumerable<string> keys = new List<string>() { "A", "B", "C", "A", "B", "C", "D" }; 
     IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C", "Val A", "Val B", "Val C", "Val D" }; 

     var x = from string key in keys 
       join string val in values on key equals val.Substring(val.Length - 1, 1) 
       select new 
       { 
        key, 
        val 
       };