【问题标题】:Linq FirstOrDefault evaluates predicate each iteration?Linq FirstOrDefault 每次迭代都会评估谓词?
【发布时间】:2012-12-23 00:59:07
【问题描述】:

如果我有这样的陈述:

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

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

【问题讨论】:

  • 为什么不自己检查一下?
  • 我目前在使用它的情况下使用它并不重要。我只是好奇!
  • 你仍然可以用你自己的代码来满足你的好奇心

标签: c# linq foreach iteration


【解决方案1】:

考虑这段代码:

    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

GET:4

GET:3

【讨论】:

  • 是的,它会在每次迭代中调用你的方法。
  • 是的。但是,请仔细考虑...您的代码看起来会将不同的 id 与流中的不同整数进行比较....根本不是每个都有
【解决方案2】:

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

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

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

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

【讨论】:

  • 我知道,我只是有点好奇,在任何地方都找不到这方面的文档。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多