【问题标题】:add key and value from different collections into dictionary将不同集合中的键和值添加到字典中
【发布时间】:2012-01-11 21:29:47
【问题描述】:

我有两个带有字符串值的数组和一个字典,我试图将 array1 中的值添加为键,将 array2 中的值添加为字典中的值。

在这种情况下,最佳做法是什么? 我试过关注

foreach(var i in array1)
{
    foreach(var t in array2)
    dictionary.add(i.value, t.value)
}

【问题讨论】:

  • 您在此处显示的代码由于多种原因无法正常工作 - 但如果您可以提供一个简短但 完整 的示例,包括 array1 和 array2 的声明,这会有所帮助。

标签: c# c#-4.0


【解决方案1】:

可以这样做(在 .NET 4 中):

var dictionary = array1.Zip(array2, (key, value) => new { key, value })
                       .ToDictionary(pair => pair.key, pair => pair.value);

这基本上将两个数组压缩在一起,因此您最终得到了一系列对。然后调用ToDictionary 扩展方法,从每对中提取键和值。

或者,你可以用老式的方式来做:

var dictionary = new Dictionary<string, string>();
for (int i = 0; i < array1.Length; i++)
{
    dictionary[array1[i]] = array2[i]; // Or use Add
}

当然,在这两种情况下,您都应该确保数组的长度相同。

【讨论】:

  • Zip 版本的效率必须低于简单的for 循环。不是吗?
  • @gdoron 的效率肯定较低,因为它没有很好的理由分配匿名类型的实例。 “方式”效率较低,也许不是。这取决于数组的大小以及应用程序对内存压力和 GC 问题的敏感程度。
  • @gdoron:它们都是 O(n) 解决方案 - 对于 Zip 解决方案,常数因素会更糟,当然......但我只会把它作为决定因素证明它不够好之后使用的实现。
  • 不管怎样,For 更好、更易读、更高效,(虽然不那么cool
  • 第一个代码似乎有效,您能否解释一下代码中的单词对?有点困惑
【解决方案2】:

您可以使用.Zip 扩展方法:

var array1 = new[] { "key1", "key2", "key3" };
var array2 = new[] { "value1", "value2", "value3" };
if (array1.Length != array2.Length) 
{
   throw new Exception("The two arrays must have same lengts");
}
Dictionary<string, string> dic = array1
    .Zip(array2, (x, y) => new { Key = x, Value = y })
    .ToDictionary(x => x.Key, x => x.Value);

【讨论】:

    【解决方案3】:

    这两个数组的长度是否相等?如果他们是 一个简单的循环就可以解决问题,

    for(int i = 0; i<array1.length();i++)
    {
      dict.put(array1[i],array2[i]);
    }
    

    【讨论】:

    • 那甚至不会编译,它不是Java Script!
    • 长度相同,但都是var类型
    【解决方案4】:

    另一种 linq 方法

    var dictionary = new Dictionary<string, string>();
    foreach (var pair in array1.Zip(array2, (a, b) => new KeyValuePair<string, string>(a, b)))
        ((ICollection<KeyValuePair<string, string>>)dictionary).Add(pair);
    

    编辑

    更具可读性:

    var dictionary = new Dictionary<string, string>();
    var collection = (ICollection<KeyValuePair<string, string>>)dictionary;
    var pairs = array1.Zip(array2, (a, b) => new KeyValuePair<string, string>(a, b));
    
    foreach (var pair in pairs)
        collection.Add(pair);
    

    【讨论】:

    • 我肯定宁愿打我的腿然后阅读\调试这段代码... =)
    • @gdoron 请查看编辑后的答案,如果没有其他原因,为了你的腿。
    猜你喜欢
    • 2020-08-07
    • 2017-10-02
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多