3

如果我有这样的声明:

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

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

4

3 回答 3

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

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

得到:5

得到:4

得到:3

于 2013-01-09T02:38:13.853 回答
2

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

但这很容易通过以下版本的代码来解决。

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

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

于 2013-01-09T02:40:14.367 回答
1

实际上很明显,调用是针对每个项目执行的——FirstOrDefault()将委托作为参数。使用 lambda 方法有点模糊了这一事实,但最终该方法只看到一个委托,它可以为每个项目调用以检查谓词。为了仅在某些魔术机制必须理解和重写该方法时才评估右侧,并且(有时可悲)编译器和运行时内部没有真正的魔术。

于 2013-01-09T02:56:00.367 回答