2016-05-19 3 views
3

У меня есть следующий словарь:LINQ с использованием .ToDictionary без .select

Dictionary<string, string> clauses = new Dictionary<string, string>(); 

где положения, как это:

"A|B" - "some text" 
"A|D|E" - "some text" 
"G" - "some text" 
"E|A" - "some text" 
... 

, и я хочу, чтобы заполнить ниже словарь:

Dictionary<string, int> columnsBitMap = new Dictionary<string, int>(); 

, где значения string являются уникальными letters первых строк словаря и 01 Значениявычисляются по математической формуле.

У меня есть следующее, который работает отлично:

columnsBitMap = String.Join("|", clauses.Select(clause => clause).Select(clause => clause.Key)).Split('|') 
       .Distinct().OrderBy(column => column) 
       -- can I remove the next Select ? 
       .Select((column, index) => new KeyValuePair<string, int>(column, index)) 
       .ToDictionary(column => column.Key, column => Convert.ToInt32(Math.Pow(2, column.Value))); 

, но мне интересно, если это может быть упрощено удалением .Select части?


Результат должен быть таким:

A 1 
B 2 
D 4 
E 8 
G 16 
+1

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

+0

@nozzleman Я добавил outpu. – gotqn

ответ

5

Этот бит совершенно излишни:

.Select(clause => clause) 

Просто удалите его, а остальное должно работать нормально.


Я не вижу много причин, чтобы избавиться от части

.Select((column, index) => new KeyValuePair<string, int>(column, index)) 

Но если вы против использования KeyValuePair<TKey,TValue> вы можете просто сделать это анонимный объект

.Select((column, index) => new{ Key = column, Value = index }) 

Но нет большой разницы.


Я подошел к вашему требованию в несколько иначе:

var result = clauses.SelectMany(clause => clause.Key.Split('|')) 
      .Distinct().OrderBy(column => column) 
      .Select((column, index) => new {Key=column,Value=index}) 
      .ToDictionary(column => column.Key, column => Convert.ToInt32(Math.Pow(2, column.Value))); 

Работа пример с теста: http://rextester.com/PWC41147

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