2016-11-03 4 views
6

Ich mag würde einZwei Arrays in einem Dictinary

Dictionary<string, int[]> dict 

aus zwei Arrays erstellen:

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

das Ergebnis:

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

Gibt es eine Weise, die ich tun kann, das mit LINQ? Ich habe über Zip gelesen, aber ich glaube nicht, dass ich verwenden kann, da ich Werte zu einem vorhandenen key.value-Array hinzufügen muss.

+0

Was meinst du ich Wert hinzufügen müssen? In Ihrem aktuellen Fall für Schlüssel A haben Sie den Wert 6 oder 5? – mybirthname

+0

Es tut mir leid für die Verwirrung. Ich möchte einen weiteren Wert in das Array hinzufügen, wenn der Schlüssel bereits existiert. – Terry

Antwort

8

Verwenden Sie .Zip, um die beiden Sammlungen miteinander zu verbinden, und anschließend GroupBy, um die Schlüssel zu gruppieren.

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

Dann diese Elemente in das Wörterbuch hinzufügen, die Sie bereits haben: Ich änderte die int[] zu List<int> so ist es einfacher, 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

Das hat perfekt funktioniert! Ich hatte gehofft, Zip würde funktionieren, aber ich vermisste die .groupby! Vielen Dank! – Terry

+0

@Terry - Sie sind willkommen :) –

4

Linq Lösung zu handhaben:

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); 

Ergebnis:

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

Danke Dmitry! Wird das testen – Terry

0

Try this:

  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()); 
Verwandte Themen