Подтвердить что ты не робот

Преобразование массива в словарь со значением как индекс элемента и ключа как самого элемента

У меня есть массив, такой как -

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

Я знаю, что это происходит потому, что он хранит индекс первого появления, но это не то, что я ищу.

4b9b3361

Ответ 1

Вы можете использовать перегрузку 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]);

Обратите внимание, что ToDictionary выдаст исключение, если вы попытаетесь предоставить два равных ключа. Вы должны тщательно подумать о возможности того, что ваш массив имеет в себе два равных значения и что вы хотите в этой ситуации.

У меня возникнет соблазн просто сделать это вручную:

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