問題描述
我有一個 IEnumerable<IEnumerable<double>>
它基本上可以被認為是一個二維數組,我想做的是得到一個一維數組(或列表或其他)這是我原始收藏的所有列的總數.換句話說,如果我有:
I have an IEnumerable<IEnumerable<double>>
which can basically be thought of as a 2D array of doubles and what I want to do is get a 1D array (or list or whatever) that is the total for all the columns of my original collection. In other words, if I had:
1 2 3 4
2 3 1 6
3 4 5 6
-------------
6 9 9 16
我想要最后一行(顯然,這不是原始集合的一部分).
I'd want the last line (which is not part of the original collection, obviously).
有沒有一種簡單的方法可以使用 LINQ 來完成此操作,這樣我就不必遍歷整個事情了?我知道我可以使用 .Sum
合計一行或一列,但我想合計每一行.
Is there a simple way to do this with LINQ so that I don't have to loop over the whole thing? I know I can use .Sum
to total one row or one column, but I want to total each row.
我看到了一些建議使用 group
的其他問題(主要是處理數據庫查詢),但這似乎對我不起作用.我試過這個:
I've seen some other questions (mostly dealing with database queries) that suggest using group
but that didn't seem to work for me. I tried this:
var totals = from p in toTotal
group p by 1 into g
select g.Sum(t => t.First());
但這只是全部.
有沒有聰明的方法來做到這一點?
Is there a clever way to do this?
例如,如果 toTotal
被定義為:
for example, if toTotal
was defined as:
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}
};
推薦答案
好的.我想我已經成功了:
Ok. I think I've hit on it:
var totals = toTotal.Aggregate((prev, next) => prev.Zip(next, (a, b) => a + b));
訣竅是我一直在尋找 Fold
(或 Reduce
)函數,但在 LINQ 中它被稱為 Aggregate
.
The trick was that I was looking for a Fold
(or Reduce
) function, but in LINQ it's called Aggregate
.
這里有一個 fiddle 顯示了這個和@Habib 的總行代碼(用于比較).與我在這里(以及我在實際代碼中使用的)的唯一變化是我需要 .ToList
.Zip
的結果,因為對于這個測試用例我有一個 List<List<double>>
如果您沒有明確轉換為列表,這似乎會讓編譯器感到不安.在我的實際代碼中, toTotal
是一個 IEnumerable
Here's a fiddle showing this and @Habib's code for totaling rows (for comparison). The only change from what I have here (and what I was using in my actual code) is that I needed to .ToList
the result of .Zip
because for this test case I have a List<List<double>>
and that seems to upset the compiler if you don't explicitly convert to a list. In my actual code toTotal
is an IEnumerable<IEnumerable<double>>
and doesn't need converting.
這篇關于對二維數組的列求和的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!