タイトル : Re^2: 組み合わせ合計検索 つづき 投稿日 : 2023/08/16(Wed) 15:16 投稿者 : たけし
お世話になります。 > 今でも VB2010 (.NET Framework 4) のままなのでしょうか? はい。 > > ↓こちらでエラーでます。 > > If values.Any(Function(v) v <= 0) Then Throw New ArgumentOutOfRangeException("values", "自然数が必要です。") Dim sDATA(100) As Integer に対して {36, 40, 45, 51} 4つ分しか代入しなかったので エラーでているようでした。 以下のように変更したところ正常終了できるようになりました。 Dim sDATA(100) As Integer → Dim sDATA(DataGridView1.Rows.Count - 1) As Integer > > 以下のように代入しまして > 唐突に DataGridView が出てきましたが、何行何列の構成になっていて、 すみませんでした。DataGridViewの値は以下でテストしていました。 {60, 57, 54, 45, 42, 500, 1000, 60, 25, 57} > === 以下蛇足 === > > > Dim cnt As Integer > > cnt = 0 > 2 行に分ける意味が無いので、「Dim cnt = 0」で十分かと。 > > > > For i As Integer = 0 To DataGridView1.Rows.Count - 1 > > sDATA(cnt) = Me.DataGridView1(1, i).Value > このコードを見る限り、「Option Strict On」設定ではないようですね。 > > 左辺の sDATA(cnt) は Integer 型で、右辺の Value プロパティは Object 型です。 > 代入式の左右で、データ型が一致していません。 > > > > If Me.DataGridView1(6, i).Value <> "" Then > > Data2 = Me.DataGridView1(6, i).Value > 今度は、比較式の左辺が Object 型で、右辺が String 型な点に違和感があります。 > > データ型を常に意識しましょう。 > また、変数 Data2 が唐突に現れましたが、これがどんな型の変数なのか示されていません。 > > たとえば Integer 型への変換を必要としているなら、Integer.TryParse メソッドの利用を検討してください。 > これならば、入力値を整数型に変換できるかどうかの検査も一緒に行うことができます。 > https://hiros-dot.net/VBNET2005/String/String14.htm > 第一引数に文字列、第二引数に Integer 型変数を渡します。 > 戻り値は、変換成功なら True、変換失敗なら False となります。 > > > > For ii As Integer = 0 To Data2 - 2 > > sDATA(cnt) = Me.DataGridView1(1, i).Value > > cnt = cnt + 1 > > Next ii > ここも、もう少し整理できそう。 > ループ内で変数 i は変化しないのに、毎回、セルを参照し続けるのはあまり効率が良くないです。 参考になりました。 ありがとうございます。 続いて以下の値でテストしてみました。 Dim 値一覧3 As Integer() = {36, 40, 45, 51, 55, 65, 69, 76, 82, 98, 106, 108, 115, 116, 118, 119, 123, 129, 133, 139, 148, 159, 163, 165, 184, 186} 探索(1230, 値一覧3) For 設定値 = 設定値 To 設定値 - ★ Step -1 結果 = FindCombination(設定値, 寸法一覧) If 結果.Length > 0 Then Exit For Next ★の値を20に設定すると Console.WriteLine("抽出できませんでした。") となり ★の値を50に設定すると Console.WriteLine("合計値:{0} 詳細値:{1}", 結果.Sum(), String.Join(", ", 結果.Select(Function(寸法) CStr(寸法)))) でてきます。 ★の値を20にした場合でも 例えば 186+184+165+163+159+148+106+115 = 1226なので 正常終了させたいです。 何か良い方法ありましたでしょうか。 |