41

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

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),...}

これは最初の発生のインデックスを格納しているために発生することはわかっていますが、それは私が探していることではありません。

4

2 に答える 2

81

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

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

私はそれを手動でやろうと思うでしょう:

var dictionary = new Dictionary<string, int>();
for (int i = 0; i < array.Length; i++)
{
    dictionary[array[i]] = i;
}
于 2013-03-06T16:06:09.367 に答える
3

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

var dictionary = arr.ToDictionary(x => Array.IndexOf(arr, x));
于 2018-03-31T22:26:25.907 に答える