【问题标题】:LINQ & IEnumerable<String> Re-evaluationLINQ & IEnumerable<String> 重新评估
【发布时间】:2010-10-20 08:47:59
【问题描述】:

早上好,

我编写了以下 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&lt;String&gt;,我需要使用打印ListaTmp 的基数

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

并打印ListaTmp的内容,使用

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

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

非常感谢。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

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

    试试这个:

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

    这会枚举一次并将结果存储在List&lt;string&gt; 中。

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

    【讨论】:

    【解决方案2】:

    这是因为 ListaTmp 不是一个结果集,而是一个查询。特别是对于 Count,您实际上是在创建一个新查询(扩展 Linq 表达式),然后执行该查询。

    ListaTmp真正的类型不是IEnumerable,而是IQueryable,是一个Linq查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多