20

キーが顧客の注文のにマップされているLinqを使用IEnumerable<Order> ordersする方法を持っています。Dictionary<string, IEnumerable<Order>>Order.CustomerNameIEnumerable

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の回答の代わりに、本当にタイプが必要な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 に答える