Where子句没有进入lambda
本文关键字:lambda 子句 Where | 更新日期: 2023-09-27 18:14:58
我有以下lambda
var entities = JTransformer.Queryer.GetList()
.Where(x => { var y = JStubs.GetType(x.Name);
return (y.Impliments(baseType) && y.IsGenericType); });
我在JStub中设置了一个断点。我创建的GetType函数,但每次我试图运行该语句时,它都不能命中它。
JTransformer.Queryer.GetList()
返回一个Enumerable,我已经检查了确保它有值
- Results View Expanding the Results View will enumerate the IEnumerable
+ [0] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+ [1] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+ [2] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+ [3] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+ [4] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+ [5] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+ [6] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+ [7] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
那么为什么我的lambda从来没有被运行?
编辑:我应该澄清一下。我后来在实体上做了一个for-each
,它没有什么可迭代的。
foreach (var entity in entities)
{
(some code never get's hit)
}
但是当我做下面的
var entities = JTransformer.Queryer.GetList().ToList()
.Where(x => { var y = JStubs.GetType(x.Name);
return (y.Impliments(baseType) && y.IsGenericType); });
突然间所有的实体都有了值,for-each
中的代码点击
在这种情况下,entities是而不是一个集合。这是一个延迟调用,返回一个集合。
这里有一个轻微的语义差异,当您考虑使用生成无限大小的IEnumerables时,这一点更加明显。如:
public IEnumerable<int> InfiniteRepeat(int i)
{
do
{
yield return i;
} while (true);
}
正如您所看到的,实际上您永远无法存储该集合。如果你要调用infinitererepeat (1). tolist(),你会抛出一个OutOfMemoryException。
你们的情况似乎与此相似。你有一些查询,当你在调试模式下检查值时执行,但在运行时,什么都没有。调用ToList()强制IEnumerable将内容加载到内存中(列表),这强制对IEnumerable进行求值。 您必须使用.ToList()
或.ToArray()
或在for-each
中迭代,从而导致枚举的"实际"执行。它本身除了创建一个Func
引用之外什么也不做。