GroupBy
これを除いToLookUp
てほぼ同じ機能を持っています:リファレンス
GroupBy:GroupBy演算子は、いくつかのキー値に基づいて要素のグループを返します。各グループはIGroupingオブジェクトで表されます。
ToLookup:ToLookupはGroupByと同じです。唯一の違いは、GroupByの実行が延期されるのに対し、ToLookupの実行は即時であるということです。
サンプルコードを使用して違いを明確にしましょう。Person
モデルを表すクラスがあるとします。
class Personnel
{
public int Id { get; set; }
public string FullName { get; set; }
public int Level { get; set; }
}
その後、personnels
以下のリストを定義します。
var personnels = new List<Personnel>
{
new Personnel { Id = 1, FullName = "P1", Level = 1 },
new Personnel { Id = 2, FullName = "P2", Level = 2 },
new Personnel { Id = 3, FullName = "P3", Level = 1 },
new Personnel { Id = 4, FullName = "P4", Level = 1 },
new Personnel { Id = 5, FullName = "P5", Level =2 },
new Personnel { Id = 6, FullName = "P6", Level = 2 },
new Personnel { Id = 7, FullName = "P7", Level = 2 }
};
次に、レベルごとにグループ化する必要がありpersonnels
ます。ここでは2つのアプローチがあります。GroupBy
またはを使用しToLookUp
ます。前に述べたように、を使用GroupBy
すると、遅延実行が使用されます。つまり、コレクションを反復処理すると、次のアイテムが要求されるまで計算される場合とされない場合があります。
var groups = personnels.GroupBy(p => p.Level);
personnels.RemoveAll(p => p.Level == 1);
foreach (var product in groups)
{
Console.WriteLine(product.Key);
foreach (var item in product)
Console.WriteLine(item.Id + " >>> " + item.FullName + " >>> " + item.Level);
}
上記のコードでは、最初にをグループ化しましたpersonnels
が、それを繰り返す前に、いくつかを削除しましたpersonnels
。は遅延実行を使用するため、グループ化はここでポイントでGroupBy
計算されるため、最終結果には削除されたアイテムは含まれません。foreach
出力:
2
2 >>> P2 >>> 2
5 >>> P5 >>> 2
6 >>> P6 >>> 2
7 >>> P7 >>> 2
しかし、上記のコードを次のように書き直した場合:(コードは前のコードと同じですが、GroupBy
が置き換えられていることに注意してくださいToLookUp
)
var groups = personnels.ToLookup(p => p.Level);
personnels.RemoveAll(p => p.Level == 1);
foreach (var product in groups)
{
Console.WriteLine(product.Key);
foreach (var item in product)
Console.WriteLine(item.Id + " >>> " + item.FullName + " >>> " + item.Level);
}
ToLookUp
即時実行を使用する場合、メソッドを呼び出すと結果が生成され、グループが適用されることを意味します。したがって、反復の前にToLookUp
アイテムを削除しても、最終結果には影響しません。personnels
出力:
1
1 >>> P1 >>> 1
3 >>> P3 >>> 1
4 >>> P4 >>> 1
2
2 >>> P2 >>> 2
5 >>> P5 >>> 2
6 >>> P6 >>> 2
7 >>> P7 >>> 2
注:両方GroupBy
とToLookUp
も異なるタイプを返します。
ToLookUpの代わりにToDictionaryを使用することもできますが、これに注意する必要があります:(参照)
ToLookup()の使用法は、ToDictionary()の使用法と非常によく似ており、どちらもキーセレクター、値セレクター、および比較子を指定できます。主な違いは、ToLookup()は重複キーを許可(および期待)するのに対し、ToDictionary()は許可しないことです。