タイトルの通りです。レビューで指摘されたことの備忘録として書きます。
なぜLINQのクエリ結果に複数回反復処理をしてはいけないのか
反復処理の回数だけクエリが実行されてしまうため。
LINQはクエリ結果が必要になったときに初めて実行される(遅延評価)。
しかし、クエリ結果に対して複数回反復処理を行うと反復回数=必要になったときのため、クエリが無駄に実行されてしまう。
例
static void Main(string[] args)
{
var a = Enumerable.Range(0, 5).Select(x => DisplayEvenNum(x));
foreach (var n in a);
foreach (var n in a);
}
static int DisplayEvenNum(int n)
{
if(n % 2 == 0)
{
Console.Write(n);
}
return n;
}
//結果
//024024
//aを呼び出すたびにDisplayEvenNumが実行されてしまう
対処方法
クエリ結果を即時評価する。
具体的にはクエリ結果に対してToList
かToArray
メソッドを使い、リストor配列を作成することで1度だけ評価されるようにする。
例
static void Main(string[] args)
{
var a = Enumerable.Range(0, 5).Select(x => DisplayEvenNum(x)).ToList();//.ToList()で即時評価する
foreach (var n in a);
foreach (var n in a);
}
static int DisplayEvenNum(int n)
{
if(n % 2 == 0)
{
Console.Write(n);
}
return n;
}
//結果
//024