代码之家  ›  专栏  ›  技术社区  ›  kateroh

IEnumerable<T>到Dictionary<string,使用LINQ的IEnumeraable<T>

  •  20
  • kateroh  · 技术社区  · 12 年前

    IEnumerable<Order> orders ,如何获得 Dictionary<string, IEnumerable<Order>> 使用Linq,密钥在 Order.CustomerName 映射到 IEnumerable 客户订单的数量。

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

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

    3 回复  |  直到 12 年前
        1
  •  34
  •   spender    12 年前

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

    您可以创建 I查找 使用 .ToLookup 扩展方法如下:

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

    那么:

    IEnumerable<Order> someCustomersOrders = ordersLookup[someCustomerName];
    
        2
  •  13
  •   Chris Sinclair    12 年前

    如果你 真正地 想要一个类型 Dictionary<string, IEnumerable<Order>> ,您可以使用:

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

    我相信还有更好的方法,但那也可以。

        3
  •  5
  •   Jeppe Stig Nielsen    12 年前

    或者你可以简单地使用

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

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