代码之家  ›  专栏  ›  技术社区  ›  BrunoLM

用C语言将两个列表映射到字典中#

  •  57
  • BrunoLM  · 技术社区  · 14 年前

    IEnumerable s公司 同样大小,我怎么能把它转换成 Dictionary 使用Linq?

    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
    

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

    我应该担心表现吗?如果我有很多收藏品呢?


    我不知道是否有更简单的方法来做,目前我是这样做的:

    我有一个扩展方法,它将循环 不可数 提供元素和索引号。

    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++);
            }
        }
    }
    

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

    输出正确:

    B: 价值B
    C: 价值C
    
    4 回复  |  直到 14 年前
        1
  •  128
  •   dahlbyk    14 年前

    对于.NET4.0(或Rx的System.Interactive的3.5版本),您可以使用 Zip() :

    var dic = keys.Zip(values, (k, v) => new { k, v })
                  .ToDictionary(x => x.k, x => x.v);
    
        2
  •  29
  •   dahlbyk    14 年前

    或者根据你的想法,LINQ包含了 Select() values 支持按索引访问,可以执行以下操作:

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

    价值观 作为 List<string> ,即……)

        3
  •  13
  •   Todd Menier    10 年前

    我喜欢这种方法:

    var dict =
       Enumerable.Range(0, keys.Length).ToDictionary(i => keys[i], i => values[i]);
    
        4
  •  0
  •   Deilan Matt Breckon    6 年前

    MoreLINQ ,你也可以利用它 ToDictionary 以前创建的扩展方法 KeyValuePair 学生:

    var dict = Enumerable
        .Zip(keys, values, (key, value) => KeyValuePair.Create(key, value))
        .ToDictionary();
    

    还应注意,使用 Zip