0

我有以下 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-eachget 中的代码被命中

4

2 回答 2

1

在这种情况下,实体不是集合。这是一个返回集合的延迟调用。

那里有轻微的语义差异,当您考虑使用产生无限大小的 IEnumerables 时,这一点更加明显。例如。

public IEnumerable<int> InfiniteRepeat(int i)
{
    do
    {
        yield return i;
    } while (true);
}

如您所见,您永远无法真正存储该集合。如果你要调用 InfiniteRepeat(1).ToList(),你会抛出 OutOfMemoryException。

你的情况似乎很相似。您有某种查询,当您尝试在调试模式下检查值时会执行该查询,但在运行时,什么都没有。调用 ToList() 会强制 IEnumerable 将内容加载到内存(列表)中,这会强制评估 IEnumerable。

于 2013-05-22T19:57:38.430 回答
0

您必须在导致“实际”执行枚举的 a 中使用.ToList().ToArray()迭代。它本身除了创建引用for-each之外什么都不做。Func

于 2013-05-22T19:29:45.670 回答