回答編集履歴

1

VB追記

2024/03/29 21:56

投稿

TN8001
TN8001

スコア9363

test CHANGED
@@ -122,3 +122,94 @@
122
122
  ```
123
123
  ![アプリ画像](https://ddjkaamml8q8x.cloudfront.net/questions/2024-03-29/830a8c78-4fd8-414f-8031-8cb25fbe1fd5.png)
124
124
  下ふたつで順番が違いますが、`DataTable`の追加順はあまり意味はないので問題ないでしょう(実際はIdや作成日等のカラムがあるでしょうから好きにソートすればいい)
125
+
126
+ ## 追記
127
+ ```vb.net
128
+ Public Class Form1
129
+ Public Sub New()
130
+ InitializeComponent()
131
+
132
+ Dim dt = New DataTable
133
+ dt.Columns.Add("Column0")
134
+ dt.Columns.Add("Column4", GetType(Decimal))
135
+ dt.Columns.Add("Column6")
136
+ dt.Rows.Add("Row0", 10D, "Group1")
137
+ dt.Rows.Add("Row1", -20D, "Group1")
138
+ dt.Rows.Add("Row2", 30D, "Group1")
139
+ dt.Rows.Add("Row3", -100D, "Group2")
140
+ dt.Rows.Add("Row4", 200D, "Group2")
141
+
142
+
143
+ '現状
144
+ Dim msms_ms = dt.AsEnumerable _
145
+ .GroupBy(Function(r) r("Column6").ToString) _
146
+ .Select(Function(g)
147
+ Dim row = dt.NewRow
148
+ row("Column0") = g.First()("Column0").ToString
149
+ row("Column4") = g.Sum(Function(r) CDec(r("Column4")))
150
+ row("Column6") = g.First()("Column6").ToString
151
+ Return row
152
+
153
+ 'カラムが多いならこれが手っ取り早いかな(何が入っているかにもよるが...
154
+ 'Dim row = dt.NewRow
155
+ 'row.ItemArray = g.First().ItemArray
156
+ 'row("Column4") = g.Sum(Function(r) CDec(r("Column4")))
157
+ 'Return row
158
+ End Function) _
159
+ .CopyToDataTable
160
+
161
+
162
+ '負の値を除外して集計後、負の値の行をマージ
163
+ Dim nururi = dt.AsEnumerable _
164
+ .Where(Function(r) CDec(r("Column4")) >= 0) _
165
+ .GroupBy(Function(r) r("Column6").ToString) _
166
+ .Select(Function(g)
167
+ Dim row = dt.NewRow
168
+ row("Column0") = g.First()("Column0").ToString
169
+ row("Column4") = g.Sum(Function(r) CDec(r("Column4")))
170
+ row("Column6") = g.First()("Column6").ToString
171
+ Return row
172
+ End Function) _
173
+ .CopyToDataTable
174
+ Dim minus = dt.AsEnumerable _
175
+ .Where(Function(r) CDec(r("Column4")) < 0) _
176
+ .CopyToDataTable
177
+ nururi.Merge(minus)
178
+
179
+
180
+ 'キー細工
181
+ Dim tn8001 = dt.AsEnumerable _
182
+ .GroupBy(Function(r)
183
+ 'グループ化するキーを負の値でなければそのまま
184
+ If 0 < CDec(r("Column4")) Then
185
+ Return r("Column6").ToString
186
+
187
+ Else '負の値だったら何かユニークな値にすれば、別のグループとして扱われる
188
+ 'ちょっと危ないか? ハッシュが衝突するというより、
189
+ '(わたしは)Column6に何が入ってるか知らないという意味で。
190
+ '(数字が入っていたらぶつかる可能性もあるかも?と)
191
+ Return r.GetHashCode.ToString
192
+
193
+ 'あるいは全カラムを連結するとか?
194
+
195
+ 'Guidがいいか?
196
+ 'Return Guid.NewGuid.ToString
197
+ End If
198
+ End Function) _
199
+ .Select(Function(g)
200
+ Dim row = dt.NewRow
201
+ row("Column0") = g.First()("Column0").ToString
202
+ row("Column4") = g.Sum(Function(r) CDec(r("Column4")))
203
+ row("Column6") = g.First()("Column6").ToString
204
+ Return row
205
+ End Function) _
206
+ .CopyToDataTable
207
+
208
+
209
+ DataGridView1.DataSource = dt
210
+ DataGridView2.DataSource = msms_ms
211
+ DataGridView3.DataSource = nururi
212
+ DataGridView4.DataSource = tn8001
213
+ End Sub
214
+ End Class
215
+ ```