早上好,

我写了下面的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>类型)运行此函数后,我需要使用以下命令打印ListaTmp的基数

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


并使用以下命令打印ListaTmp的内容

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


但是,代码的最后一行和倒数第二行都会导致ListaTmp并因此重新评估查询,这非常奇怪,因为已为变量分配了查询结果。为什么这段代码会有如此奇怪的行为?

非常感谢你。

最佳答案

这是因为LINQ使用延迟执行。请参见Charlie Calvert's article on LINQ and Deferred Execution

尝试以下方法:

var ListaTmp = ListaCorreccoes("comutador").ToList();


枚举一次,并将结果存储在List<string>中。

您可能会发现Jon Skeet的文章很有用:


Iterators, iterator blocks and data pipelines
Iterator block implementation details: auto-generated state machines

关于c# - LINQ和IEnumerable <String>重新评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3976113/

10-11 15:14