[英]Sum columns of a 2D array
我有一個IEnumerable<IEnumerable<double>>
,它基本上可以被認為是一個二維的2D數組,我想要做的是得到一個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<double>> toTotal = new List<List<double>>() {
new List<double> {1, 2, 3, 4},
new List<double> {2, 3 , 1, 6},
new List<double> {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<List<double>>
而且似乎如果您沒有顯式轉換為列表,則會擾亂編譯器。 在我的實際代碼中, toTotal
是一個IEnumerable<IEnumerable<double>>
,不需要轉換。
編輯:
你可以做:
List<List<double>> toTotal = new List<List<double>>() {
new List<double> {1, 2, 3, 4},
new List<double> {2, 3 , 1, 6},
new List<double> {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
,你可以得到它:
double[]totals = toTotal.Select(r => r.Sum()).ToArray();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.