20

IEnumerable<Order> orders,如何Dictionary<string, IEnumerable<Order>>使用 Linq 获得一个,其中的键Order.CustomerName映射到一个IEnumerable客户的订单。

orders.ToDictionary(order => order.CustomerName)不会立即起作用,因为可能有多个订单可能具有相同的 CustomerName。

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

4

3 回答 3

34

ILookup接口就是为此目的而设计的,它表示一个类似于字典的结构,每个键包含许多值。它具有与字典相似的性能特征(即它是哈希表类型结构)

您可以使用.ToLookup扩展方法创建ILookup,如下所示:

ILookup<string, Order> ordersLookup = orders.ToLookup(o => o.CustomerName)

然后:

IEnumerable<Order> someCustomersOrders = ordersLookup[someCustomerName];
于 2012-09-25T17:56:54.720 回答
13

只是@spender's answer的替代品,如果你真的想要一个 type Dictionary<string, IEnumerable<Order>>,你可以使用:

Dictionary<string, IEnumerable<Order>> dictionary = orders
        .GroupBy(order => order.CustomerName)
        .ToDictionary(groupedOrders => groupedOrders.Key, 
                          groupedOrders => (IEnumerable<Order>)groupedOrders);

我确信有更好的方法,但这也可以。

于 2012-09-25T18:02:20.223 回答
5

或者你可以简单地使用

orders.ToLookup(o => o.CustomerName).ToDictionary(g => g.Key)

但正如 Spender 的回答所表明的那样,也许你不需要最后一种方法,ToDictionary.

于 2012-09-25T18:13:00.740 回答