二维数组的和列
我有一个IEnumerable<IEnumerable>
,它基本上可以被认为是一个二维的二维数组,我想要做的是得到一个1D数组(或列表或其他),这是我原来的所有列的总和采集。 换句话说,如果我有:
1 2 3 4 2 3 1 6 3 4 5 6 ------------- 6 9 9 16
我想要最后一行(显然不是原始集合的一部分)。
是否有一种简单的方法可以使用LINQ来实现这一点,这样我就不必遍历整个事情了? 我知道我可以使用.Sum
来计算一行或一列,但我想总计每一行。
我已经看到了一些其他问题(主要是处理数据库查询),这些问题建议使用group
但这似乎对我不起作用。 我试过这个:
var totals = from p in toTotal group p by 1 into g select g.Sum(t => t.First());
但这只是总结一切。
有一个聪明的方法来做到这一点?
编辑:例如,如果toTotal
定义为:
List<List> toTotal = new List<List>() { new List {1, 2, 3, 4}, new List {2, 3 , 1, 6}, new List {3 , 4, 5 , 6} };
好。 我想我已经碰上了它:
var totals = toTotal.Aggregate((prev, next) => prev.Zip(next, (a, b) => a + b));
诀窍是我正在寻找Fold
(或Reduce
)函数,但在LINQ中它被称为Aggregate
。
这是一个小提示,显示了这个和@Habib的行总计代码(用于比较)。 我在这里(以及我在实际代码中使用的)的唯一变化是我需要.ToList
.Zip
的结果因为对于这个测试用例我有一个List
并且似乎如果您没有显式转换为列表,则会扰乱编译器。 在我的实际代码中, >
toTotal
是一个IEnumerable
,不需要转换。
编辑:
你可以做:
List> toTotal = new List>() { new List {1, 2, 3, 4}, new List {2, 3 , 1, 6}, new List {3 , 4, 5 , 6} }; var res = toTotal.Select(r => r.Select((t, i) => new { Column = i, Value = t })) .SelectMany(r => r) .GroupBy(r => r.Column) .Select(grp => new { Column = grp.Key, Sum = grp.Select(r => r.Value).Sum(), }); foreach (var item in res) { Console.WriteLine("Column: {0}, Sum: {1}", item.Column, item.Sum); }
你会得到:
Column: 0, Sum: 6 Column: 1, Sum: 9 Column: 2, Sum: 9 Column: 3, Sum: 16
老答案
你需要为IEnumerable toTotal
每个元素Sum
,你可以得到它:
上述就是C#学习教程:二维数组的和列分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
double[]totals = toTotal.Select(r => r.Sum()).ToArray();
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/990211.html