如果我的声明如下:
var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == bytereader.readInt());
此代码是否在每次迭代时从我的流中读取一个整数,或者它是否读取整数一次,存储它,然后在整个查找中使用它的值?
答案 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方法,这个事实有点模糊,但最后该方法只能看到一个委托,它可以调用每个项来检查谓词。为了评估右手边,只有一次魔法机制必须理解并重写方法,并且(有时可悲)在编译器和运行时内没有真正的魔法。