拥有IEnumerable<Order> orders
,如何使用Linq获取Dictionary<string, IEnumerable<Order>>
,其中密钥Order.CustomerName
映射到客户订单的IEnumerable
。
orders.ToDictionary(order => order.CustomerName)
无法立即生效,因为可能有多个订单可能具有相同的客户名称。
解决方案: orders.ToLookup(order => order.CustomerName);
答案 0 :(得分:33)
ILookup接口是为此目的而设计的,它表示类似于字典的结构,每个键包含许多值。它具有与字典相似的性能特征(即它是一个散列表类型结构)
您可以使用ILookup扩展名方法创建.ToLookup,如下所示:
ILookup<string, Order> ordersLookup = orders.ToLookup(o => o.CustomerName)
然后:
IEnumerable<Order> someCustomersOrders = ordersLookup[someCustomerName];
答案 1 :(得分:13)
只是替代@ spender的答案,如果真的想要类型Dictionary<string, IEnumerable<Order>>
,您可以使用:
Dictionary<string, IEnumerable<Order>> dictionary = orders
.GroupBy(order => order.CustomerName)
.ToDictionary(groupedOrders => groupedOrders.Key,
groupedOrders => (IEnumerable<Order>)groupedOrders);
我确信有更好的方法,但那也会这样做。
答案 2 :(得分:5)
或者你可以简单地使用
orders.ToLookup(o => o.CustomerName).ToDictionary(g => g.Key)
但正如Spender的回答所示,也许你不需要最后一种方法ToDictionary
。