2012-03-23 11 views
13

mam ciąg jak string strn = "abcdefghjiklmnopqrstuvwxyz" i chcą słownikiem jak:C# ToDictionary lambda wybierz indeks i element?

Dictionary<char,int>(){ 
    {'a',0}, 
    {'b',1}, 
    {'c',2}, 
    ... 
} 

Próbowałem rzeczy jak

strn.ToDictionary((x,i) => x,(x,i)=>i); 

... ale ja już się różnego rodzaju błędy o delegować nie biorąc dwóch argumentów i nieokreślonych argumentów i tym podobnych.

Co robię źle?

Wolałbym podpowiedzi nad odpowiedzią, więc mam mentalny ślad tego, co muszę zrobić na następny raz, ale zgodnie z naturą Stackoverflow, odpowiedź jest również dobra.

+0

Dlaczego spróbować go zrobić z linq? co jest nie tak z 'var dict = new Dictionary (); foreach (char c in strn) dict.Add (c, c-'a '); ' –

+1

@ L.B, Ponieważ już wiem, jak to zrobić. Chcę się nauczyć: D – mowwwalker

+0

@ L.B Pożyczyłem C# 4.0 in Depth z biblioteki i doszedłem do tego w połowie, ale nie angażowałem zbyt wiele w pamięć bez ćwiczeń, więc przestałem czytać. Z tym i ostatnim pytaniem patrzyłem online przed pytaniem i doszedłem do tych samych lub podobnych wniosków, które otrzymałem w odpowiedziach, ale jako nowy programista jestem niechętny zaufaniu, jakie małe doświadczenie mam i nieliczne wyniki google widziałem przeciwko połączonej wiedzy społeczności stackoverflow. – mowwwalker

Odpowiedz

22

pierwszego użycia operatora .Select:

strn 
    .Select((x, i) => new { Item = x, Index = i }) 
    .ToDictionary(x => x.Item, x => x.Index); 
6

Co robię źle?

Zakłada się, że takie przeciążenie to , czyli. Spójrz na Enumerable.ToDictionary - nie ma przeciążenia, które zapewnia indeks. Można udawać chociaż poprzez wywołanie Select:

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

Czy to działa? Czy nie byłoby to "pair => pair [0]"? – mowwwalker

+2

@Walkerneo: Tak, to działa. Dlaczego miałaby to być "pair [0]"? "pair" jest odwołaniem do instancji anonimowego typu wewnętrznego utworzonego w wywołaniu 'Select'. –

+0

W porządku, przetestowałem to i zadziałało, ale nadal nie mogę powiedzieć, że rozumiem dlaczego. Nie rozumiem, w jaki sposób anonimowy obiekt ma właściwości "wartość" i "indeks", które również mają wartości tych dwóch zmiennych. Czy jest skrótem dla 'new {value = value, index = index}'? – mowwwalker

1

można spróbować coś takiego:

string strn = "abcdefghjiklmnopqrstuvwxyz"; 

Dictionary<char,int> lookup = strn.ToCharArray() 
    .Select((c, i) => new KeyValuePair<char,int>(c, i)) 
     .ToDictionary(e => e.Key, e => e.Value); 
+1

ciąg już doczepiony jako IEnumerable , więc nie ma potrzeby wywoływania ToCharArray –