2010-10-20 27 views
1

早上好,LINQ和IEnumerable的<String>重新评估

我写了下面的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圈子中快得多。使用ListaTmp = ListaCorreccoes("comutador");,其中ListaTmpIEnumerable<String>类型的运行此功能后,我需要使用

 Console.Write(">> Prima qualquer tecla para listar todas as " + ListaTmp.Count() + " correcções..."); 

打印ListaTmp的基数和打印的ListaTmp的内容,用

foreach (String StrTmp in ListaTmp) 
      Console.WriteLine(StrTmp); 

然而,无论是最后和最后一行代码导致ListaTmp,因此查询为重新评估,这是非常奇怪的,因为变量被分配了查询结果。为什么这个代码有这么奇怪的行为?

非常感谢。

回答

1

这是因为ListaTmp不是结果集,而是查询。特别是对于Count,你实际上是在创建一个新的查询(你花费了Linq表达式),然后执行它。

ListaTmp的实际类型不是IEnumerable,而是IQueryable,它是Linq查询。