簡體   English   中英

二維數組的和列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM