Map two lists into a dictionary in C#

BrunoLM picture BrunoLM · Oct 28, 2010 · Viewed 41.3k times · Source

Given two IEnumerables of the same size, how can I convert it to a Dictionary using 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 ? */;

And the expected output is:

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

I wonder if there is some simple way to achieve it.

And should I be worried about performance? What if I have large collections?


I don't if there is an easier way to do it, currently I'm doing like this:

I have an Extension method that will loop the IEnumerable providing me the element and the index number.

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

And I have a method that will loop one of the Enumerables and with the index retrieve the equivalent element on the other 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;
}

Then I use it like:

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

And the output is correct:

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

Answer

dahlbyk picture dahlbyk · Oct 28, 2010

With .NET 4.0 (or the 3.5 version of System.Interactive from Rx), you can use Zip():

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