Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9749

【C#】LINQのクエリ結果に対して複数回反復処理をしない

$
0
0
タイトルの通りです。レビューで指摘されたことの備忘録として書きます。 なぜ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 参考 プログラミングC# 第8版 [雑記] LINQ と遅延評価

Viewing all articles
Browse latest Browse all 9749

Trending Articles