2013-03-06 14 views
24

Mam tablicę takich jak -Konwersja tablicy do słownika z wartości jako wskaźnik pozycji i klucz jako element samego

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

Chcę stworzyć Dictionary<string, int> taki, że wartości macierzy będzie słownika kluczami i wartościami słownikowymi będą indeksy, dzięki czemu mogę uzyskać indeks kolumny, wyszukując jej nazwy w O(1). Wiem, że to powinno być dość proste, ale nie mogę tego zrozumieć.

próbowałem -

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

jednak ta powraca -

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

wiem, że to się dzieje, ponieważ jest przechowywanie indeks pierwszego wystąpienia, ale to nie to czego szukam do zrobić.

+1

Niestety, ale dlaczego trzeba, że ​​tak czy inaczej? – Vogel612

Odpowiedz

53

Można użyć przeciążenie Select który zawiera indeks:

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

Albo użyć Enumerable.Range:

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

Zauważ, że ToDictionary rzuci wyjątek, jeśli starają się zapewnić dwa jednakowe kluczyki. Powinieneś dokładnie przemyśleć możliwość, że twoja macierz ma dwie równe wartości i to, co chcesz osiągnąć w tej sytuacji.

będę kuszony żeby zrobić to ręcznie choć:

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

@sll: Ups, naprawione. –

+2

Warto zauważyć, że pierwsze dwa błędy będą występować, jeśli występują zduplikowane wartości. Mogą najpierw dodać 'Distinct'. – Servy

+0

@Servy: Dodam notatkę, ale bez sugerowanego rozwiązania innego niż "musisz to rozważyć" :) –

Powiązane problemy