Двух массивов в один словарь
Я хотел бы создать
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());