早上好,
我写了以下LINQ查询
public static Func<String, IEnumerable<String>> ListaCorreccoes = (StrPalavra) =>
{
return (from StrTmp in ListaPossiveisCorreccoes(StrPalavra)
from StrTmp2 in ListaPossiveisCorreccoes(StrTmp)
where PalavraConhecida(StrTmp2)
select StrTmp2).Distinct();
};
令我惊讶的是,这比使用两个foreach
cicles要快得多。使用ListaTmp = ListaCorreccoes("comutador");
运行此功能后,其中ListaTmp
的类型为IEnumerable<String>
,我需要使用打印ListaTmp
的基数
Console.Write(">> Prima qualquer tecla para listar todas as " + ListaTmp.Count() + " correcções...");
并使用
打印ListaTmp
的内容
foreach (String StrTmp in ListaTmp)
Console.WriteLine(StrTmp);
但是,最后一行和前一行代码都会导致ListaTmp,因此查询将被重新评估,这是非常奇怪的,因为变量被分配了结果查询。为什么这段代码有这么奇怪的行为?
非常感谢。
答案 0 :(得分:4)
那是因为LINQ使用延迟执行。请参阅Charlie Calvert's article on LINQ and Deferred Execution。
请改为尝试:
var ListaTmp = ListaCorreccoes("comutador").ToList();
这枚举一次并将结果存储在List<string>
中。
你可能会发现Jon Skeet的文章很有用:
答案 1 :(得分:1)
这是因为ListaTmp不是结果集,而是查询。特别是对于Count,你实际上是在创建一个新的查询(你花费Linq表达式)然后执行它。
ListaTmp的真实类型不是IEnumerable,而是IQueryable,这是一个Linq查询。