我有以下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
中的代码被点击
答案 0 :(得分:1)
在这种情况下,实体不一个集合。这是一个返回集合的延迟调用。
那里存在轻微的语义差异,当你考虑使用产生无限大小的IEnumerables时更加明显。例如
public IEnumerable<int> InfiniteRepeat(int i)
{
do
{
yield return i;
} while (true);
}
正如您所看到的,您实际上永远不会存储该集合。如果您要调用InfiniteRepeat(1).ToList(),则会抛出OutOfMemoryException。
您的案例似乎相似。您有某种查询,当您尝试在调试模式下检查值时会执行该查询,但在运行时,没有任何查询。调用ToList()强制IEnumerable将内容加载到内存(列表)中,这会强制评估IEnumerable。
答案 1 :(得分:0)
您必须使用.ToList()
或.ToArray()
或在导致“实际”执行枚举的for-each
内进行迭代。除了创建Func
引用之外,它本身不会做任何事情。