【问题标题】:Which LINQ query is more effective?哪个 LINQ 查询更有效?
【发布时间】:2010-05-06 02:49:53
【问题描述】:

我有一个巨大的IEnumerable(假设名称是myItems),哪种方式更有效?

解决方案 1:先过滤,然后 ForEach。

Array.ForEach(myItems.Where(FILTER-IT-HERE).ToArray(),MY-ACTION);

解决方案 2:如果项目不符合要求,请在 MY-ACTION 中返回。

Array.ForEach(myItems.ToArray(),MY-ACTION-WITH-FILTER);

其中一个总是比另一个更好吗?或者还有什么好的建议?提前致谢。

【问题讨论】:

  • 你为什么要使用Array.ForEachToArray

标签: c# linq


【解决方案1】:

你做过测量吗?由于我们无法测量 My-Action 的运行时间,因此只有您可以。衡量和决定。

【讨论】:

    【解决方案2】:

    有时必须创建基准,因为看起来相似的活动可能会产生截然不同和意想不到的结果。

    你没有说你的数据源是什么,所以我假设它可能是 SQL 服务器上的数据,在这种情况下,服务器端的过滤可能总是最好的方法,因为你已经最小化了数据量转移。内存访问总是比数据从磁盘传输到内存要快,因此只要您可以传输较少的记录,就可能获得更好的性能。

    【讨论】:

      【解决方案3】:

      好吧,这两次,您都在转换为数组,如果 IEnumerable 非常大(如您所说),这可能不会那么有效。您可以为 IEnumerable 创建一个通用扩展方法,例如:

      public static void ForEach<T>(this IEnumerable<T> current, Action<T> action) {
          foreach (var i in current) {
              action(i);
          }
      }
      

      然后你可以这样做:

      IEnumerable<int> ints = new List<int>();
      ints.Where(i => i == 5).ForEach(i => Console.WriteLine(i));
      

      【讨论】:

        【解决方案4】:

        如果性能是一个问题,我不清楚你为什么首先要费心构造一个完整的数组。为什么不只是这个?

        foreach (var item in myItems.Where(FILTER-IT-HERE))
            MY-ACTION;
        

        或者:

        foreach (var item in myItems)
            MY-ACTION-WITH-FILTER;
        

        我之所以问是因为,虽然其他人是正确的,但如果不进行测试,您就无法真正知道,但我不认为上述两个选项之间会有很大差异。另一方面,我期望在创建/填充数组(似乎没有理由)和创建数组之间存在差异。

        【讨论】:

          【解决方案5】:

          在其他条件相同的情况下,首先调用 ToArray() 会比最后调用它时对性能产生更大的影响。虽然,正如我之前的其他人所说,

          1. 为什么要使用ToArray()Array.ForEach()
          2. 我们不知道其他一切实际上都是平等的,因为您没有透露过滤器和操作的实施细节。

          【讨论】:

            【解决方案6】:

            LINQ 的理念是处理可枚举的集合,因此最好的 LINQ 查询是完全不使用 Array.ForEach().ToArray() 的查询。

            【讨论】:

              【解决方案7】:

              我会说这属于过早优化的范畴。如果在建立基准后发现代码太慢,您可以随时尝试每种方法并选择有效的结果对你更好。

              由于我们不知道IEnumerable&lt;&gt; 是如何产生的,因此很难说哪种方法的性能更好。我们也不知道在您应用谓词后将保留多少项目 - 我们也不知道操作或迭代步骤是否将成为代码执行的主要因素。唯一确定的方法是尝试两种方式,分析结果,然后选择最好的。

              抛开性能不谈,我会选择最清晰的版本 - (对我而言)是先过滤然后将投影应用于结果。

              【讨论】:

                猜你喜欢
                • 2012-02-25
                • 1970-01-01
                • 2012-07-11
                • 1970-01-01
                • 2011-07-23
                • 2011-03-09
                • 1970-01-01
                • 2011-05-23
                • 2015-03-14
                相关资源
                最近更新 更多