しかしlinqの使い方がわからずに困っています。
GroupByには色々なオーバーロードがあるのでやり方としては色々あるのですが、例えば簡単な例はグループ化するのに使用する値を指定するバージョンが簡単です。
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.groupby?view=netframework-4.5#System_Linq_Enumerable_GroupBy__2_System_Collections_Generic_IEnumerable___0__System_Func___0___1__
この場合、グループ化の基準となる値を関数で指定する形になります。
C#
1var result = new List<object[]>();
2result.Add(new object[] { "aaa", 1, 2, 3 });
3result.Add(new object[] { "bbb", 2, 3, 4 });
4result.Add(new object[] { "aaa", 3, 4, 5 });
5
6var groupValues = result.GroupBy(x => (string)x[0]);
このようにするとオブジェクト配列の0番目が"aaa"と"bbb"の2グループのデータが出来上がります。
これであとは各グループ単位に集計すれば求めてる結果が得られると思います。
例1:計算回数を度外視してシンプルに記述
C#
1var sumValues = result
2 .GroupBy(x => (string)x[0])
3 .Select(x => new object[] {
4 x.Key,
5 x.Sum(y => (int)y[1]),
6 x.Sum(y => (int)y[2]),
7 x.Sum(y => (int)y[3]),
8 })
9;
例2:計算回数を抑えて記述
C#
1var sumValues = result
2 .GroupBy(x => (string)x[0])
3 .Select(x => {
4
5 var values = new object[4];
6
7 values[0] = x.Key;
8 values[1] = 0;
9 values[2] = 0;
10 values[3] = 0;
11
12 foreach (var obj in x) {
13 values[1] = (int)values[1] + (int)obj[1];
14 values[2] = (int)values[2] + (int)obj[2];
15 values[3] = (int)values[3] + (int)obj[3];
16 }
17
18 return values;
19 })
20;
例3:計算回数を抑えつつ、結果に匿名クラスを使用
C#
1var sumValues3 = result
2 .GroupBy(x => (string)x[0])
3 .Select(x => {
4
5 var result = new { Key = x.Key, SumValues = new int[3] };
6
7 foreach (var obj in x) {
8 result.SumValues[0] += (int)obj[1];
9 result.SumValues[1] += (int)obj[2];
10 result.SumValues[2] += (int)obj[3];
11 }
12
13 return result;
14 })
15;