teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2021/03/21 08:16

投稿

退会済みユーザー
answer CHANGED
@@ -49,4 +49,96 @@
49
49
 
50
50
  結果は:
51
51
 
52
- ![イメージ説明](64bb2d5fae6b3f95abaee4ea22059cb9.jpeg)
52
+ ![イメージ説明](64bb2d5fae6b3f95abaee4ea22059cb9.jpeg)
53
+
54
+ **【追記】**
55
+
56
+ 下の 2021/03/21 17:08 の私のコメントで「上の回答で書いたコードの grouped を Country でもう一度グループ化します。後で回答欄に追記しておきます」と書いた件です。上の回答は .NET Framework 4.8 ですが、質問者さんは .NET 5 とのことですので .NET 5 で書きました。
57
+
58
+ コードの下の方にある Human2, Person クラスに IEnumerable<Human2> として取得しています。それを JSON にシリアライズした結果も書いておきます(2021/03/21 15:11 のコメントのものと同じです)。
59
+
60
+ ```
61
+ using System;
62
+ using System.Collections.Generic;
63
+ using System.Linq;
64
+ using System.Text.Json;
65
+
66
+ namespace ConsoleAppLinq
67
+ {
68
+ class Program
69
+ {
70
+ static void Main(string[] args)
71
+ {
72
+ IEnumerable<Human> human = new List<Human>
73
+ {
74
+ new Human{ Country = "JP", Name = "Taro", Login = 10},
75
+ new Human{ Country = "JP", Name = "Jiro", Login = 5},
76
+ new Human{ Country = "US", Name = "Mike", Login = 20},
77
+ new Human{ Country = "JP", Name = "Taro", Login = 1}
78
+ };
79
+
80
+ var grouped = human
81
+ .GroupBy(h => new { Country = h.Country, Name = h.Name })
82
+ .Select(g => new Human
83
+ {
84
+ Country = g.Key.Country,
85
+ Name = g.Key.Name,
86
+ Login = (uint)g.Sum(x => x.Login)
87
+ });
88
+
89
+ foreach (var item in grouped)
90
+ {
91
+ Console.WriteLine($"Country: {item.Country}, Name: {item.Name}, Login: {item.Login}");
92
+ }
93
+
94
+ // ここまでは前回の回答と同じ
95
+
96
+ Console.WriteLine("------------------------------");
97
+
98
+ var grouped2 = grouped
99
+ .GroupBy(h => h.Country)
100
+ .Select(g => new Human2
101
+ {
102
+ Country = g.Key,
103
+ PersonalData = g.Select(p => new Person
104
+ {
105
+ Name = p.Name,
106
+ Login = p.Login
107
+ })
108
+ });
109
+
110
+ var json = JsonSerializer.Serialize<IEnumerable<Human2>>(grouped2,
111
+ new JsonSerializerOptions
112
+ {
113
+ WriteIndented = true
114
+ });
115
+
116
+ Console.WriteLine(json);
117
+ }
118
+ }
119
+
120
+ public class Human
121
+ {
122
+ public string Country { get; set; }
123
+ public string Name { get; set; }
124
+ public uint Login { get; set; }
125
+ }
126
+
127
+ public class Human2
128
+ {
129
+ public string Country { get; set; }
130
+ public IEnumerable<Person> PersonalData { get; set; }
131
+ }
132
+
133
+ public class Person
134
+ {
135
+ public string Name { get; set; }
136
+ public uint Login { get; set; }
137
+ }
138
+
139
+ }
140
+ ```
141
+
142
+ 結果は:
143
+
144
+ ![イメージ説明](5d1d0ebcf1ba20533f4c61658ba8c7c4.jpeg)