Подтвердить что ты не робот

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);

4b9b3361

Ответ 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.