2012-03-23 2 views
13

У меня есть строка, как string strn = "abcdefghjiklmnopqrstuvwxyz" и хочу словарь, как:C# ToDictionary лямбда выберите индекс и элемент?

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

Я пытался что-то вроде

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

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

Что я делаю неправильно?

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

+0

Почему вы пытаетесь его делать с linq? что не так с 'var dict = new Dictionary (); foreach (char c in strn) dict.Add (c, c-'a '); ' –

+1

@ L.B, потому что я уже знаю, как это сделать. Я хочу узнать: D – mowwwalker

+0

@ L.B Я позаимствовал C# 4.0 в глубине из библиотеки и получил примерно половину пути, но я не занимался большой памятью без практики, поэтому я прекратил читать. С этим и последним вопросом я действительно смотрел онлайн, прежде чем спрашивать, и я пришел к тем же или похожим выводам, которые предлагали ответы, но, как новый программист, я неохотно доверяю, что мало опыта у меня есть, и несколько результаты google, которые я видел против общей мудрости сообщества stackoverflow. – mowwwalker

ответ

22

Используйте .Select оператор первого:

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

Что я делаю неправильно?

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

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

Будет ли это работать? Разве это не пара 'pair => [0]'? – mowwwalker

+2

@Walkerneo: Да, это работает. Почему это будет 'pair [0]'? 'pair' - это ссылка на экземпляр анонимного внутреннего типа, созданного в вызове' Select'. –

+0

Хорошо, я протестировал его, и это сработало, но я все еще не могу сказать, что понимаю, почему. Я не понимаю, как анонимный объект имеет свойства 'value' и' index', которые также имеют значения этих двух переменных. Является ли это сокращенным для 'new {value = value, index = index}'? – mowwwalker

1

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

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

строка уже разрисована как IEnumerable , поэтому нет необходимости в вызове ToCharArray –

Смежные вопросы