【问题标题】:column operations on jagged arrays (sum, average, other functions) with Linq使用 Linq 对锯齿状数组(求和、平均、其他函数)进行列操作
【发布时间】:2014-06-25 21:09:26
【问题描述】:

假设我们有一个具有相等长度项数组的锯齿状数组(即忽略超出范围的捕获):

int[][] jaggedArray = new int[][] 
{
    new int[] {1, 3, 5},
    new int[] {0, 2, 4},
    new int[] {11,22,6}
};

应用 c# Linq 执行列操作的最优雅的方式是什么。简单列操作 Sum 和 Average 的示例结果:

Sum() 列结果:int[] {12, 27, 15 } Average() 列结果:int[] {4, 9, 5 } ...对列进行操作的任何其他类似扩展方法。

我能找到的最接近的相关问题是here

感谢您的回答,我已接受 Jay 的回答,并在 Enumerable 问题 here 上发布了类似但更复杂的列聚合。

【问题讨论】:

  • 你试过什么?以及为什么需要使用 LINQ,即其他“优雅”的解决方案是否无效?
  • 感谢您的评论。是的,当然,其他选项是有效的/直接的(我目前在您的典型循环中也这样做)-但我对任何与代表一起使用的优雅 linq 解决方案感兴趣-我的尝试看起来像我喜欢的问题-即相当混乱。
  • LINQ 比使用两个 for 循环完成这项工作要慢得多。在性能问题的情况下,不要使用 LINQ。

标签: c# linq jagged-arrays


【解决方案1】:
  var results = Enumerable.Range(0, jaggedArray[0].Length)
    .Select(i => jaggedArray.Sum(a => a[i]))
    .ToArray();

Average 替换Sum 等等。

【讨论】:

  • 注意:jaggedArray.Length 与列数不同。
  • @Keith 谢谢;我抄错了——应该是jaggedArray[0].Length
【解决方案2】:
private static IEnumerable<int> GetColumnValues(IEnumerable<int[]> arr, int columnIndex)
{
    return arr.Select(a => a.Skip(columnIndex).FirstOrDefault());
}
...
GetColumnValues(jaggedArray, 1).Sum();

对于所有列计算,使用 Enumerable.Range

var res = Enumerable.Range(0, 3).Select(columnIndex => GetColumnValues(jaggedArray, columnIndex).Sum());

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多