3

関連するカテゴリでグループ化したいアイテムのIEnumerableがあります。アイテムは、それらに関連付けられているカテゴリ(リスト)によってグループ化されているため、1つのアイテムが複数のカテゴリの一部になる可能性があります。

var categories = numbers.SelectMany(x => x.Categories).Distinct();
var query = 
      from cat in categories
      select new {Key = cat, 
                  Values = numbers.Where(n => n.Categories.Contains(cat))};

私は上記のコードを使用し、実際には機能しますが、数値に数千の値が含まれている場合、この操作の実行が遅くなる可能性があるため、これを行うより効率的な方法があるかどうか疑問に思いました。

私は、コードのリファクタリングをより効率的にすることを強く求めています。

4

1 に答える 1

3

LINQ の組み込みのグループ化機能を使用できます。これは、contains ルックアップよりも高速です。ただし、パフォーマンス関連の質問と同様に、動作することがわかっているコードを書き直す方法を決定する前に、パフォーマンス メトリックを収集するコードを実際に作成する必要があります。作業するボリュームのパフォーマンスにまったく問題がないことが判明する場合があります。

というわけで、これがコードです。これはテストされていませんが、次のようなものが動作するはずです:

var result = from n in numbers
             from c in n.Categories
             select new {Key = c, n.Value}
             into x group x by x.Key into g
             select g;

各グループには、キーとそのキーに属する一連の値が含まれています。

foreach( var group in result )
{
    Console.WriteLine( group.Key );
    foreach( var value in group )
        Console.WriteLine( value );
}
于 2010-08-25T23:23:50.857 に答える