Двух массивов в один словарь

Я хотел бы создать

 Dictionary<string, int[]> dict

из двух массивов:

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

результат:

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

есть ли способ сделать это с LINQ? Я читал о Zip, но я не думаю, что могу использовать, так как мне нужно добавить значения к существующему ключу.массив значений.

3 ответов


использовать .Zip чтобы связать две коллекции вместе, а потом GroupBy для группировки ключей.

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

затем, чтобы добавить эти элементы в словарь, который у вас уже есть: я изменил int[] до List<int> так легче обрабатывать 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());
    }
}

в LINQ устранение:

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

тест:

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

  Console.Write(report);

итог:

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

попробуйте это :

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