C # ToDictionary лямбда выбрать индекс и элемент? - PullRequest
16 голосов
/ 24 марта 2012

У меня есть строка типа string strn = "abcdefghjiklmnopqrstuvwxyz" и я хочу словарь, например:

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

Я пробовал что-то вроде

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

... но я получаю всевозможные ошибки о том, что делегат не принимает два аргумента, неуказанные аргументы и тому подобное.

Что я делаю не так?

Я бы предпочел подсказки над ответом, так что у меня есть мысленный след того, что мне нужно сделать в следующий раз, но, учитывая природу Stackoverflow, ответ тоже подойдет.

Ответы [ 3 ]

27 голосов
/ 24 марта 2012

Сначала используйте оператор .Select:

strn
    .Select((x, i) => new { Item = x, Index = i })
    .ToDictionary(x => x.Item, x => x.Index);
7 голосов
/ 24 марта 2012

Что я делаю не так?

Вы предполагаете, что является такой перегрузкой.Посмотрите на Enumerable.ToDictionary - нет перегрузки, которая обеспечивает индекс.Вы можете подделать его, позвонив по номеру Select:

var dictionary = text.Select((value, index) => new { value, index })
                     .ToDictionary(pair => pair.value,
                                   pair => pair.index);
1 голос
/ 24 марта 2012

Вы можете попробовать что-то вроде этого:

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