7

私はかなり奇妙なものを見つけました(私は思う!)。yes() メソッドにブレークポイントを設定しようとすると、関数の実行時にプログラムが一時停止することはありません。他のコード行に同じことをしようとすると、期待どおりに機能します。それはバグですか、それとも私を逃れている何かがありますか?

フィルターは 2 つのオブジェクトを返します。デバッガーを除いて、すべてが期待どおりに機能しているようです。

private void Form1_Load(object sender, EventArgs e) {
    List<LOL> list = new List<LOL>();
    list.Add(new LOL());
    list.Add(new LOL());

    IEnumerable<LOL> filter = list.Where(
        delegate(LOL lol) {
            return lol.yes();
        }
    );

    string l = "";   <------this is hit by the debugger
}

class LOL {
    public bool yes() {
        bool ret = true; <---------this is NOT hit by the debugger
        return ret;
    }
}
4

4 に答える 4

17

Enumerable.Where は遅延演算子です。where によって返される IEnumerable を通過する何かを呼び出すまで (つまり、.ToList() を呼び出すまで)、関数は呼び出されません。

コードを次のように変更して、呼び出されるかどうかを確認してください。

....
IEnumerable<LOL> filter = list.Where(
    delegate(LOL lol) {
        return lol.yes();
    }
).ToList();

string l = "";
于 2009-06-23T03:36:01.233 に答える
2

ジョナサンは正しいです。

このコンソールアプリケーションを実行して、明確に表示されるように指示された場所にブレークポイントを設定してみてください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<LOL> list = new List<LOL>();
            list.Add(new LOL());
            list.Add(new LOL());

            IEnumerable<LOL> filter = list.Where(
                delegate(LOL lol)
                {
                    return lol.yes();
                }
            );

            // Breakpoint #2 will not have been yet.
            Console.Write("No Breakpoint"); // Breakpoint #1 
            // (Breakpoint #2 will now be hit.)
            Console.Write("Breakpoint! " + filter.Count()); 
        }

        class LOL
        {
            public bool yes()
            {
                bool ret = true; // Breakpoint #2
                return ret;
            }

        }

    }
}
于 2009-06-23T03:58:46.150 に答える
2

リストを具体化する必要があります。追加...

filter.ToList();

...宣言の後、ブレークポイントに到達します。私が見た最高の議論についてはここ. それは、私ができるよりもはるかに優れた遅延評価を行います。

于 2009-06-23T03:36:37.813 に答える
2

他の人が言ったように、あなたは基準を定義したばかりですが、実行を求めていません。これは遅延読み込みと呼ばれます (間違っていたら訂正してください)。

フィルターで foreach ループを実行して、何が起こるかを確認します。

于 2009-06-23T03:38:54.127 に答える