2010-10-20 71 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查詢。