【问题标题】:Two arrays into one Dictionary两个数组合为一个字典
【发布时间】:2016-11-03 09:10:09
【问题描述】:

我想创建一个

 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,但我认为我不能使用,因为我需要将值添加到现有的 key.value 数组中。

【问题讨论】:

  • 我需要增值是什么意思?在您当前的密钥 A 情况下,您的值将是 6 或 5 ?
  • 很抱歉造成混乱。只要键已经存在,我想在数组中添加另一个值。

标签: c# arrays linq dictionary


【解决方案1】:

使用.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&lt;int&gt;,以便更容易处理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());
}

【讨论】:

  • 这非常有效!我希望 Zip 可以工作,但我错过了 .groupby!谢谢!
【解决方案2】:

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]

【讨论】:

  • 谢谢德米特里!将对此进行测试
【解决方案3】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多