web-dev-qa-db-ja.com

2つのリストをC#の辞書にマップする

2つ指定IEnumerables 同じサイズで、どのように変換できますかDictionaryLinqを使用

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

それを達成する簡単な方法はあるのだろうか。

そして、パフォーマンスについて心配する必要がありますか?大規模なコレクションがある場合はどうなりますか?


それを行う簡単な方法がある場合、私はありません、現在私はこのようにやっています:

要素とインデックス番号を提供する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の1つをループし、インデックスを使用して他の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
62
BrunoLM

.NET 4.0(またはRxのSystem.Interactiveの3.5バージョン)では、Zip()を使用できます。

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

または、あなたの考えに基づいて、LINQにはインデックスを提供するSelect()のオーバーロードが含まれます。 valuesがインデックスによるアクセスをサポートするという事実と組み合わせて、次のことができます。

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

valuesList<string>として保持される場合、つまり...)

24
dahlbyk

私はこのアプローチが好きです:

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

MoreLINQ を使用する場合、以前に作成されたKeyValuePairsで ToDictionary 拡張メソッドを利用することもできます。

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

また、Zip拡張メソッドを使用することは、異なる長さの入力コレクションに対して安全であることにも注意する必要があります。

0
Deilan