Enumerable.AsEnumerable<>() 是不是强制评估表达式? [复制]
Posted
技术标签:
【中文标题】Enumerable.AsEnumerable<>() 是不是强制评估表达式? [复制]【英文标题】:Does Enumerable.AsEnumerable<>() force the evaluation of the expression? [duplicate]Enumerable.AsEnumerable<>() 是否强制评估表达式? [复制] 【发布时间】:2020-11-19 13:43:13 【问题描述】:string[] fruits = "apple", "passionfruit", "banana", "mango",
"orange", "blueberry", "grape", "strawberry" ;
List<int> lengths = fruits.Select(fruit => fruit.Length).ToList();
Enumerable.ToList()
或 Enumerable.ToArray()
执行急切评估,它们强制评估。
Enumerable.AsEnumerable()
也一样吗?
谢谢
【问题讨论】:
您是在谈论 Xamarin 的ToEnumerable
还是 .NET 的 AsEnumerable
(“To”或“As”)?你在标题中说一个,在问题中说另一个
AsEnumerable 不做任何事情。 ToEnumerable 我不确定
@ShamPooSham 我刚刚编辑了问题,抱歉并感谢您的回答
Msdn 有一篇文章Classification of Standard Query Operators by Manner of Execution (C#)。它有一个很好的表,每个方法和它的执行类型
【参考方案1】:
简而言之,没有。它什么都不做,它只是返回输入集合,用不同的接口输入。
从IQueryable<T>
切换到IEnumerable<T>
的唯一实际目的是使用可枚举版本而不是可查询版本执行进一步的 LINQ 方法,从而使评估转到“客户端”。
但是,它本身并没有做任何事情。
【讨论】:
你是对的,但在客户端进行评估并非完全没有:它可能涉及将大量数据从数据库传输到客户端。这就是为什么在最新的 EF 版本上这种转换不再是自动的。 @XavierAM 它本身什么也不做。它只会改变持有它的变量的编译时类型,这反过来会导致进一步的调用选择不同的重载。使用强制转换或as
关键字也有相同的效果。以上是关于Enumerable.AsEnumerable<>() 是不是强制评估表达式? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何循环遍历行,然后在每行循环遍历列直到找到NA,然后提取前一列的值