【问题标题】:Linq Query ToList() Acting UpLinq 查询 ToList() 正在执行
【发布时间】:2010-11-16 19:04:56
【问题描述】:
var v = object.where(a => a.date > DateTime(2000,1,1,));
list = v.ToList();

好的,对于下面的代码,我在每一行都设置了断点。当我到达第一行时,我运行代码(F5)直到它到达第二行。当我从第二行向前(F11)时,它会返回到第一行。当我运行代码 (F5) 时,它不会进入第二行并引发错误。

我的 linq 查询是错误的,还是其他什么不起作用?我完全糊涂了。

【问题讨论】:

  • 我认为您需要发布一些实际代码。该示例按原样不应该编译。
  • 一些真正的代码会很好。该示例不完整且无法编译。
  • 您能否提供引发的错误?另外,您真的是要从名为“对象”的对象中调用“在哪里”,还是抽象?另外,为什么你的 DateTime 中有一个额外的逗号?

标签: c# linq


【解决方案1】:

由于延迟执行,第一行的 lambda 表达式只有在第二行迭代结果时才会执行。

这种行为是完全正确的。

Here 是一个很好的解释。

【讨论】:

  • 这不会导致调试器跳转到第一行。
  • 是的。延迟执行是通过使用自定义迭代器的状态机实现的(如果我没记错 Eric Lippert 的博客)。使用yield return 不会导致调试器跳转到该行,因为这意味着它会在代码中的某处使用goto,完全无视控制流。
  • @Femaref:是的。但是,当进入ToList() 时,调试器可能仍会跳转到第一行。我不记得了。如果他在 lambda 内部设置断点,它肯定会。
  • @Femaref - 实际上,是的。 lambda 语句是一个委托,因此进入 ToList() 操作会逐步执行外部代码并进入被调用的委托方法(在我们的例子中,它是在 Where() 调用的参数中定义的单行代码)。您必须进入通话 (F11),而不仅仅是结束通话 (F10)。
  • ToList的来源是v,是Where()方法调用产生的IEnumerable<T>(具体是WhereIterator<T>)。 WhereIterator 是封装过滤行为的中间对象。当 Where() 被调用时,所有实际的方法都是创建一个 WhereIterator,给它源 IEnumerable 和 lambda,然后返回它。当调用其 GetEnumerator() 方法时,WhereIterator 将遍历其源,并 yield 返回每个元素,这些元素在传递给 lambda 时使 lambda 返回 true。在这里调用时,调试会进入 lambda。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多