Linq FirstOrDefault在每次迭代中计算谓词



如果我有这样的语句:

var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == bytereader.readInt());

这段代码是每次迭代都从我的流中读取一个整数,还是只读取一次,存储它,然后在整个查找过程中使用它的值?

考虑以下代码:

    static void Main(string[] args)
    {
        new[] { 1, 2, 3, 4 }.FirstOrDefault(j => j == Get());
        Console.ReadLine();
    }
    static int i = 5;
    static int Get()
    {
        Console.WriteLine("GET:" + i);
        return i--;
    }

它显示,它将调用该方法所需的次数来满足第一个匹配条件的元素。输出将是:

得到:5

得到:4

得到:3

如果不检查,我不知道,但希望它每次都能读取它。

但是这很容易通过下面的代码版本来修复。

byte val = bytereader.readInt();
var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == val);

我自己,无论如何都会自动采取这种方法,只是为了消除任何疑问。这可能是一个好习惯,因为没有理由为每个条目阅读。

实际上很明显,该调用是为每个项目执行的- FirstOrDefault()接受委托作为参数。通过使用lambda方法,这个事实有点模糊,但最终该方法只看到一个委托,它可以为每个项目调用该委托来检查谓词。为了只对右边求一次值,必须有一些神奇的机制来理解和重写方法,而且(有时很遗憾)编译器和运行时内部并没有真正的神奇机制。

相关内容

  • 没有找到相关文章

最新更新