IEnumerable <T> to Dictionary <string,IEnumerable <T >>使用LINQ

kat*_*roh 19 c# linq .net-3.5

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

orders.ToDictionary(order => order.CustomerName) 不会马上工作,因为可能有多个订单可能具有相同的CustomerName.

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

spe*_*der 33

所述ILookup接口被设计用于此目的,并且表示包含每个键许多值的字典状结构.它具有与字典相似的性能特征(即它是一个哈希表类型结构)

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

ILookup<string, Order> ordersLookup = orders.ToLookup(o => o.CustomerName)
Run Code Online (Sandbox Code Playgroud)

然后:

IEnumerable<Order> someCustomersOrders = ordersLookup[someCustomerName];
Run Code Online (Sandbox Code Playgroud)

  • +1这是一个很棒的界面.在今天之前从未听说过它. (5认同)

Chr*_*air 13

只是替代@splander的答案,如果你真的想要一个类型Dictionary<string, IEnumerable<Order>>,你可以使用:

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

我确信有一个更好的方式,但那也会这样做.

  • @ScottChamberlain"ILookup"和"Dictionary"之间的主要区别在于字典是可变的.如果您需要在创建后更改结果,则需要使用Dictionary(在这种情况下,OP可能需要不可变版本).也有可能存在类型为`Dictionary`的现有方法/属性,并且需要将其传递给它. (4认同)
  • @ScottChamberlain - 一方面,OP要求一本字典.`Dictionary`支持比查找更多的操作(例如它可以被修改),并且OP可能有一些需要字典的现有代码. (3认同)

Jep*_*sen 5

或者你可以简单地使用

orders.ToLookup(o => o.CustomerName).ToDictionary(g => g.Key)
Run Code Online (Sandbox Code Playgroud)

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