使用LINQ创建一个包含两个列表的字典

20

我正在尝试从两个列表中创建一个字典,其中一个列表包含键,另一个列表包含值。我可以使用for循环来完成,但我正在尝试找到是否有一种使用LINQ的方法来完成它。

示例代码将会有所帮助。谢谢!

5个回答

51
在.NET4中,您可以使用内置的Zip方法合并这两个序列,然后调用ToDictionary
var keys = new List<int> { 1, 2, 3 };
var values = new List<string> { "one", "two", "three" };

var dictionary = keys.Zip(values, (k, v) => new { Key = k, Value = v })
                     .ToDictionary(x => x.Key, x => x.Value);

21
        List<string> keys = new List<string>();
        List<string> values = new List<string>();
        Dictionary<string, string> dict = keys.ToDictionary(x => x, x => values[keys.IndexOf(x)]);

当然,这假设每个列表的长度相同且键是唯一的。

更新: 这个答案更加高效,适用于非常大的列表。


我宁愿使用循环,而不是使用这个。仍然给答案加1。 - Steven
为什么你会使用循环而不是LINQ呢?我认为这段代码比for循环更加简洁易读。 - VNarasimhaM
13
因为使用上述代码时,每次需要在键的List<string>中进行线性搜索以查找元素x(以O(n)的时间复杂度)。但是,在循环中,每次迭代时都已知索引,因此无需进行搜索。 - Paul Ruane
1
正如@PaulRuane所指出的那样,但我认为值得强调的是,这个解决方案非常低效,可能会成为完全不必要的瓶颈,应该避免。请参见此答案 - larsmoa

4
您可以在 Select 表达式中包含索引以提高效率:
        var a = new List<string>() { "A", "B", "C" };
        var b = new List<string>() { "1", "2", "3" };

        var c = a.Select((x, i) => new {key = x, value = b[i]}).ToDictionary(e => e.key, e => e.value );

        foreach (var d in c)
            Console.WriteLine(d.Key + " = " + d.Value);

        Console.ReadKey();

1
var dic = keys.Zip(values, (k, v) => new { k, v })
          .ToDictionary(x => x.k, x => x.v);

4
这真的对LukeH在5年前的答案(https://dev59.com/h3E95IYBdhLWcg3wJKl_#2434647)有所补充吗? - Rawling

-3
你可以使用这段代码,它能够完美地工作。
C# 代码:
  var keys = new List<string> { "Kalu", "Kishan", "Gourav" };
        var values = new List<string> { "Singh", "Paneri", "Jain" };

        Dictionary<string, string> dictionary = new Dictionary<string, string>();
        for (int i = 0; i < keys.Count; i++)
        {

            dictionary.Add(keys[i].ToString(), values[i].ToString());
        }
        foreach (var data in dictionary)
        {
            Console.WriteLine("{0} {1}", data.Key, data.Value);

        }
        Console.ReadLine();

输出屏幕:

enter image description here


任务太繁琐了。 - netfed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接