IEnumerable <t> to Dictionary <string,ienumerable <t =“”>&gt;使用LINQ </string,> </t>

时间:2012-09-25 17:53:09

标签: c# linq .net-3.5

拥有IEnumerable<Order> orders,如何使用Linq获取Dictionary<string, IEnumerable<Order>>,其中密钥Order.CustomerName映射到客户订单的IEnumerable

orders.ToDictionary(order => order.CustomerName)无法立即生效,因为可能有多个订单可能具有相同的客户名称。

解决方案: orders.ToLookup(order => order.CustomerName);

3 个答案:

答案 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