2016-11-03 23 views
6

Tôi muốn tạo ra mộtHai mảng thành một Dictinary

Dictionary<string, int[]> dict 

ra của hai mảng:

string[] keys = { "A", "B", "A", "D" }; 
int[] values = { 1, 2, 5, 2 }; 

kết quả:

["A"] = {1,5} 
["B"] = {2} 
["D"] = {2} 

Có cách nào tôi có thể làm điều này với LINQ? Tôi đã đọc về Zip nhưng tôi không nghĩ rằng tôi có thể sử dụng vì tôi cần phải thêm giá trị vào một mảng key.value hiện có.

+0

Ý anh là gì bởi tôi cần phải thêm giá trị? Trong trường hợp hiện tại của bạn cho khóa A, bạn sẽ có giá trị 6 hoặc 5? – mybirthname

+0

Im xin lỗi vì sự nhầm lẫn. Tôi muốn thêm một giá trị khác vào mảng bất cứ khi nào khóa đã tồn tại. – Terry

Trả lời

8

Sử dụng .Zip để liên kết hai bộ sưu tập với nhau và sau đó GroupBy để nhóm các khóa.

string[] keys = { "A", "B", "A", "D" }; 
int[] values = { 1, 2, 5, 2 }; 

var result = keys.Zip(values, (k, v) => new { k, v }) 
       .GroupBy(item => item.k, selection => selection.v) 
       .ToDictionary(key => key.Key, value => value.ToArray()); 

Sau đó, để thêm các mục vào từ điển mà bạn đã có: Tôi đã thay đổi int[] để List<int> vì vậy nó rất dễ dàng để xử lý Add/AddRange

Dictionary<string, List<int>> existingDictionary = new Dictionary<string, List<int>>(); 
foreach (var item in result) 
{ 
    if (existingDictionary.ContainsKey(item.Key)) 
    { 
     existingDictionary[item.Key].AddRange(item.Value); 
    } 
    else 
    { 
     existingDictionary.Add(item.Key, item.Value.ToList()); 
    } 
} 
+1

Điều này làm việc hoàn hảo! Tôi đã hy vọng Zip sẽ làm việc nhưng tôi đã bỏ lỡ .groupby! Cảm ơn! – Terry

+0

@Terry - bạn được chào đón :) –

4

LINQ giải pháp:

string[] keys = { "A", "B", "A", "D" }; 
    int[] values = { 1, 2, 5, 2 }; 

    Dictionary<string, int[]> dict = keys 
    .Zip(values, (k, v) => new { 
     key = k, 
     value = v }) 
    .GroupBy(pair => pair.key, pair => pair.value) 
    .ToDictionary(chunk => chunk.Key, 
        chunk => chunk.ToArray()); 

T est:

string report = String.Join(Environment.NewLine, dict 
    .Select(pair => $"{pair.Key} [{string.Join(", ", pair.Value)}]")); 

    Console.Write(report); 

Kết quả:

A [1, 5] 
    B [2] 
    D [2] 
+0

Cảm ơn bạn Dmitry! Sẽ kiểm tra điều này – Terry

0

Hãy thử điều này:

  string[] keys = { "A", "B", "A", "D" }; 
      int[] values = { 1, 2, 5, 2 }; 

      Dictionary<string, int[]> dict = keys.Select((x, i) => new { key = x, value = values[i] }).GroupBy(x => x.key, y => y.value).ToDictionary(x => x.Key, y => y.ToArray()); 
Các vấn đề liên quan