IEnumerable <T> для словаря <строка, IEnumerable <T>> с использованием LINQ
Имея IEnumerable<Order> orders
, как получить Dictionary<string, IEnumerable<Order>>
с помощью Linq, где ключ Order.CustomerName
сопоставлен с IEnumerable
заказов клиентов.
orders.ToDictionary(order => order.CustomerName)
не будет работать сразу, поскольку может быть несколько заказов, которые могут иметь одно и то же имя клиента.
Решение: orders.ToLookup(order => order.CustomerName);
Ответы
Ответ 1
Интерфейс ILookup предназначен для этой цели и представляет собой подобную словарю структуру, содержащую множество значений для каждого ключа. Он имеет схожие характеристики с характеристиками словаря (т.е. Структуры типа хэш-таблицы)
Вы можете создать ILookup с помощью . ToLookup метод расширения следующим образом:
ILookup<string, Order> ordersLookup = orders.ToLookup(o => o.CustomerName)
то
IEnumerable<Order> someCustomersOrders = ordersLookup[someCustomerName];
Ответ 2
Как альтернатива ответу @spender, если вы действительно хотите тип Dictionary<string, IEnumerable<Order>>
, вы можете использовать:
Dictionary<string, IEnumerable<Order>> dictionary = orders
.GroupBy(order => order.CustomerName)
.ToDictionary(groupedOrders => groupedOrders.Key,
groupedOrders => (IEnumerable<Order>)groupedOrders);
Я уверен, что там лучше, но это тоже сделает.
Ответ 3
Или вы могли бы просто использовать
orders.ToLookup(o => o.CustomerName).ToDictionary(g => g.Key)
Но поскольку ответ Spender указывает, может быть, вам не нужен последний метод, ToDictionary
.