Linq FirstOrDefault会在每次迭代时评估谓词吗?

时间:2013-01-09 02:33:26

标签: c# linq foreach iteration

如果我的声明如下:

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

此代码是否在每次迭代时从我的流中读取一个整数,或者它是否读取整数一次,存储它,然后在整个查找中使用它的值?

3 个答案:

答案 0 :(得分:3)

考虑以下代码:

    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--;
    }

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

  

GET:5

     

GET:4

     

GET:3

答案 1 :(得分:2)

我不知道没有检查,但希望每次都能阅读。

但是使用以下版本的代码可以很容易地解决这个问题。

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

我自己,我会自动采取这种方法,只是为了消除任何疑问。形成一个好习惯,因为没有理由为每个项目阅读它。

答案 2 :(得分:1)

实际上很明显,每个项都会执行调用 - FirstOrDefault()将一个委托作为参数。通过使用lambda方法,这个事实有点模糊,但最后该方法只能看到一个委托,它可以调用每个项来检查谓词。为了评估右手边,只有一次魔法机制必须理解并重写方法,并且(有时可悲)在编译器和运行时内没有真正的魔法。