LINQ&amp; IEnumerable <string>重新评估</string>

时间:2010-10-20 08:48:00

标签: c# linq

早上好,

我写了以下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,因此查询将被重新评估,这是非常奇怪的,因为变量被分配了结果查询。为什么这段代码有这么奇怪的行为?

非常感谢。

2 个答案:

答案 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查询。