【问题标题】:Efficient column operations (sum, average...) on very large Enumerable<arrayType[]> with Linq使用 Linq 对非常大的 Enumerable<arrayType[]> 进行高效的列操作(求和、平均...)
【发布时间】:2014-05-08 14:03:37
【问题描述】:

假设我们有以下 IEnumerable 示例:

IEnumerable<int[]> veryLargeJaggedArray =
{
   new int[] {1, 3, 5},
   new int[] {0, 2, 4},
   new int[] {11,22,6},
   ...lots of data streaming in
}

如果底层集合不基于 ICollection(即没有快速 Count() 查找),应用 c# Linq 执行聚合类型列操作的最有效方法是什么?

这个问题将我的previous question 扩展到一个更实际的案例。

【问题讨论】:

    标签: c# linq stream ienumerable


    【解决方案1】:

    在给定输入的情况下,您可以轻松创建自己的方法来生成表示列的序列:

    public static IEnumerable<T> GetColumn<T>(
        this IEnumerable<IList<T>> data, 
        int columnNumber)
    {
        return data.Select(row => row[columnNumber]);
    }
    

    现在你可以编写如下代码:

    var firstColumnSum = veryLargeJaggedArray.GetColumn(0).Sum();
    var secondColumnAverage = veryLargeJaggedArray.GetColumn(1).Average();
    

    【讨论】:

      【解决方案2】:

      内置的扩展方法已经很聪明了。你通常只需要这样的东西:

      var result = MyCollection.Sum();
      

      var result = MyCollection.Average(i => i.NumericProperty);
      

      这些扩展方法利用了重载和多态性,因此如果您的底层集合类型实现了IList&lt;T&gt;,则该方法的版本(可以利用 Count 属性)将被调用,但如果只有IEnumerable&lt;T&gt;可用,则IEnumerable&lt;T&gt; 将运行。

      【讨论】:

      • 他作用于一系列数组,而不仅仅是一个平面序列,因此这些选项都不会编译。
      猜你喜欢
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2011-11-21
      • 2020-01-08
      相关资源
      最近更新 更多