2009-03-06 4 views
138

Я использовал ключевое слово «select» и метод расширения для возврата IEnumerable<T> с LINQ, но мне нужно вернуть общий Dictionary<T1, T2> и не могу понять это. Например, я узнал об этом от используемого что-то в форме, похожей на следующее:Выберите словарь <T1, T2> с LINQ

IEnumerable<T> coll = from x in y 
    select new SomeClass{ prop1 = value1, prop2 = value2 }; 

Я также сделал то же самое с методами расширения. Я предположил, что поскольку элементы в Dictionary<T1, T2> можно повторить как KeyValuePair<T1, T2>, я мог бы просто заменить «SomeClass» в приведенном выше примере «new KeyValuePair<T1, T2> { ...», но это не сработало (Key и Value были отмечены как readonly, поэтому я не мог скомпилируйте этот код).

Возможно ли это, или мне нужно сделать это несколькими шагами?

Спасибо.

ответ

221

Методы расширения также обеспечивают расширение ToDictionary. Он довольно прост в использовании, общее использование пропускает лямбда-селектор для ключа и получает объект в качестве значения, но вы можете передать лямбда-селектор как для ключа, так и для значения.

class SomeObject 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

SomeObject[] objects = new SomeObject[] 
{ 
    new SomeObject { ID = 1, Name = "Hello" }, 
    new SomeObject { ID = 2, Name = "World" } 
}; 

Dictionary<int, string> objectDictionary = objects.ToDictionary(o => o.ID, o => o.Name); 

objectDictionary[1] Тогда содержит ли значение "Hello"

+3

+1 Whuh. Это открывает новые возможности по отношению к созданию новых объектов данных. – Sung

+1

Удивительный, рад, что вы сможете использовать его, я знаю, что это помогло мне в некоторых ситуациях. –

+2

Эгады! Сейчас 2017 год, и я только что узнал об этом! –

34
var dictionary = (from x in y 
        select new SomeClass 
        { 
         prop1 = value1, 
         prop2 = value2 
        } 
       ).ToDictionary(item => item.prop1); 

Это предполагает, что SomeClass.prop1 является искомым Key для словаря.

+21

'.ToDictionary (item => item.prop1, item => item.prop2);' to explicity также задает значение. – finoutlook

11

Коллекция KeyValuePair еще более ясна и работает очень хорошо.

Dictionary<int, string> dictionary = objects 
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name)) 
    .ToDictionary(x=>x.Key, x=>x.Value); 
Смежные вопросы