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

171

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

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

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

Это возможно, или мне нужно сделать это в несколько этапов?

Спасибо.

Богатый
источник

Ответы:

284

Методы расширений также предоставляют расширение 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]будет содержать значение «Привет»

Квинтин Робинсон
источник
44
var dictionary = (from x in y 
                  select new SomeClass
                  {
                      prop1 = value1,
                      prop2 = value2
                  }
                  ).ToDictionary(item => item.prop1);

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

albertein
источник
27
.ToDictionary(item => item.prop1, item => item.prop2);для простоты установить значение тоже.
прогноз погоды
42

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

Dictionary<int, string> dictionary = objects
    .Select(x=> new KeyValuePair<int, string>(x.Id, x.Name))
    .ToDictionary(x=>x.Key, x=>x.Value);
Антуан Мельцхайм
источник
Можно ли удалить .ToDictionary (x => x.Key, x => x.Value); и заменить новый KeyValuePair новым словарем?
Амир Хаджиха
@ AmirNo-Family Вы ошибаетесь. Метод Select (x => x ...) выполняет проекцию для каждого элемента коллекции объектов . Таким образом, замена нового KeyValuePair новым словарем создаст словарь словарей. Я не думаю, что это то, к чему вы стремитесь.
Антуан Мельцхайм,
У меня есть список словаря <строка, строка> и пытался использовать select на них, но он выдает ошибку компиляции.
Амир Хаджиха