Как унифицировать два массива в словаре?

Если у вас есть два массива string[] a и int[] b, как вы можете получить Dictionary<string,int> из него наиболее эффективно и с минимальным кодом? Предположим, что они содержат одинаковое количество элементов.

Например, это лучший способ?

Dictionary<string,int> vals = new Dictionary<string,int>();
for(int i = 0; i < size; i++)
{
    vals.Add(a[i],b[i]);
}

Ответы

Ответ 1

Если ваша цель состоит в том, чтобы совпадать с позициями внутри последовательностей, вы можете использовать Enumerable.Zip.

int[] myInts = { 1, 2 };
string[] myStrings = { "foo", "bar"};

var dictionary = myStrings.Zip(myInts, (s, i) => new { s, i })
                          .ToDictionary(item => item.s, item => item.i);

И так как вы работаете с массивами, писать "longhand" действительно не так уж и долго. Тем не менее, вы хотите проверить заранее, что массивы действительно равны по длине.

var dictionary = new Dictionary<string, int>();

for (int index = 0; index < myInts.Length; index++)
{
    dictionary.Add(myStrings[index], myInts[index]);
}

Обычно Linq может привести к более выразительному, понятному коду. В этом случае утверждается, что верно противоположное.

Ответ 2

Если это .Net 4, вы можете сделать следующее:

var result = a.Zip(b, (first, second) => new {first, second})
    .ToDictionary(val => val.first, val => val.second);

Без Zip вы также можете сделать это:

var result = Enumerable.Range(0, a.Length).ToDictionary(i => a[i], i => b[i]);

Ответ 3

Использование ToDictionary:

        int idx = 0;
        var dict = b.ToDictionary(d => a[idx++]);

Ответ 4

var result = a.ToDictionary(x => x, x => b[a.IndexOf(x)]);