web-dev-qa-db-ja.com

配列を辞書に変換し、値をアイテムのインデックスとして、キーをアイテム自体として

次のような配列があります-

arr[0] = "Name";
arr[1] = "Address";
arr[2] = "Phone";
...

配列値がディクショナリキーになり、ディクショナリ値がインデックスになるようにDictionary<string, int>を作成し、O(1)で名前をクエリして列のインデックスを取得できるようにします。 。これはかなり単純なはずですが、頭を悩ますことはできません。

私は試した -

Dictionary<string, int> myDict = arr.ToDictionary(x => x, x => indexOf(x))

ただし、これは戻ります-

{(Name, 0), (Address, 0), (Phone, 0),...}

私はこれが最初の発生のインデックスを保存しているために起こることを知っていますが、それは私がやろうとしていることではありません。

30
neuDev33

インデックスを含むSelectのオーバーロードを使用できます。

var dictionary = array.Select((value, index) => new { value, index })
                      .ToDictionary(pair => pair.value, pair => pair.index);

またはEnumerable.Range

var dictionary = Enumerable.Range(0, array.Length).ToDictionary(x => array[x]);

2つの等しいキーを提供しようとすると、ToDictionaryは例外をスローすることに注意してください。配列に2つの等しい値がある可能性と、その状況で何をしたいのかを慎重に検討する必要があります。

私はただ手動でそれをやろうと思っています:

var dictionary = new Dictionary<string, int>();
for (int i = 0; i < array.Length; i++)
{
    dictionary[array[i]] = i;
}
64
Jon Skeet

別の方法は次のとおりです。

var dictionary = arr.ToDictionary(x => Array.IndexOf(arr, x));
1
Hazy