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中的代码点击

Where子句没有进入lambda

在这种情况下,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引用之外什么也不做。