4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2022-03-31

タイトルの通りです。レビューで指摘されたことの備忘録として書きます。

なぜ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が実行されてしまう

対処方法

クエリ結果を即時評価する。

具体的にはクエリ結果に対してToListToArrayメソッドを使い、リスト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

参考

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?