Выберите словарь <T1, T2> с помощью LINQ

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

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, поэтому я не смог скомпилировать этот код).

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

Спасибо.

Ответ 1

Методы расширений также предоставляют расширение 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"

Ответ 2

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

Предположим, что SomeClass.prop1 - желаемый Key для словаря.

Ответ 3

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

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);