将两个列表映射到C#中的字典

给定两个 相同大小的 IEnumerable s ,如何将其转换为 使用Linq Dictionary

 IEnumerable<string> keys = new List<string>() { "A", "B", "C" }; IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C" }; var dictionary = /* Linq ? */; 

预期的产出是:

 A: Val A B: Val B C: Val C 

我想知道是否有一些简单的方法来实现它。

我应该担心performance吗? 如果我有大量collections呢?


我不这样做,如果有更简单的方法来做到这一点,目前我正在这样做:

我有一个扩展方法,将循环IEnumerable提供我的元素和索引号。

 public static class Ext { public static void Each<T>(this IEnumerable els, Action<T, int> a) { int i = 0; foreach (T e in els) { a(e, i++); } } } 

我有一个方法将循环其中一个Enumerables和索引检索另一个Enumerable上的等效元素。

 public static Dictionary<TKey, TValue> Merge<TKey, TValue>(IEnumerable<TKey> keys, IEnumerable<TValue> values) { var dic = new Dictionary<TKey, TValue>(); keys.Each<TKey>((x, i) => { dic.Add(x, values.ElementAt(i)); }); return dic; } 

然后我使用它:

 IEnumerable<string> keys = new List<string>() { "A", "B", "C" }; IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C" }; var dic = Util.Merge(keys, values); 

输出是正确的:

 A: Val A B: Val B C: Val C 

使用.NET 4.0(或来自Rx的System.Interactive的3.5版本),您可以使用Zip()

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

或者根据您的想法,LINQ包含提供索引的Select()重载。 结合values支持索引访问的事实,可以执行以下操作:

 var dic = keys.Select((k, i) => new { k, v = values[i] }) .ToDictionary(x => xk, x => xv); 

(如果values保存为List<string> ,那就是…)

我喜欢这种方法:

 var dict = Enumerable.Range(0, keys.Length).ToDictionary(i => keys[i], i => values[i]);