質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

931閲覧

配列とhashtableについて質問です。

xss

総合スコア36

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/11/17 07:13

編集2017/11/20 03:05

###前提・実現したいこと
プログラム初心者です。
1次元配列をKeyにHashtableを格納した1次元配列をValueにしたhashtable
を作成したいです。

###発生している問題・エラーメッセージ
作成したhashTableのbを配列のcに追加したいのですが、
前回のレコードの情報が残っててしまいエラーが出てしまうので
解決方法が知りたいです。

他に実現しやすい方法があればご教授いただければ幸いです。
イタリックテキスト
雑な質問で申し訳ありませんがよろしくお願いします。

エラーメッセージ

エラーメッセージ:System.ArgumentException: '項目は既に追加されています。
###該当のソースコード

Function aaa 'DBからレコードを取得しdtに格納 dtはdatatable型 dt = 関数getDBData '1次元配列 のちのHashTableのKey Dim a As New ArrayList 'Hashtable作成用変数 Dim b As New Hashtable() 'Hashtable格納用1次元配列 Dim c As New ArrayList '戻り値格納用 Dim d As New Hashtable '取得したレコード数分回します For x As Integer = 0 To dt.Rows.Count - 1   '1次元配列を作成 a.Add(dt.Rows(x)) 'DBから取得したレコードのカラム数分回します For y As Integer = 0 To dt.Columns.Count - 1         'Key=Columns、Value=レコードの内容のhashtableを作成 b.Add(dt.Columns.Item(y).ColumnName, dt.Rows(0).ItemArray(y)) Next 'Hashtableを配列に格納 c.Add(b) Next d.Add(a, c) Return d End Function

###試したこと
他の方法を調べましたがうまいこと見つけられませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
開発環境 VisualStudio2017 vb.net

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/17 07:55

コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。
退会済みユーザー

退会済みユーザー

2017/11/17 08:05 編集

> 他に実現しやすい方法があればご教授いただければ幸いです。← 全体的なやりたいことのシナリオ・ストーリーを書いていただけると、それに沿った代案が出てくるかもしれません。DB からデータを取得して HashTable を作るというのは個人的にはピンときません。(その HashTable をどのように使うかにもよりますが) Linq to Entity を使うとか、ADO.NET の DataTable に Fill するとかの手段は考えられたのでしょうか?
xss

2017/11/17 09:21

SurferOnWwwさん回答ありがとうございます。 初めての投稿でマナーが至りませんでした、参考にします。内容をご拝見しました。今回のプログラムはDBから取得したレコードのカラムと内容を使いまわそうと考えていたのでこの考えにいたりましたが、確かに不足な面が多いと思います。アドバイスを読みましたが具体的で分かりやすかったです。本当にコメントありがとうございます。
退会済みユーザー

退会済みユーザー

2017/11/17 10:18

今からでも遅くはないので、コードは ``` と ``` で囲ってください。ベストアンサーをつけたらこのスレッドは終わりという訳ではないです。Teratail は know-how の蓄積も目的にしているそうです。なので、後から検索などでここにたどり着いた人のことも考えてください。
xss

2017/11/20 03:08

SurferOnWwwさんご指摘ありがとうございます。コードを```で囲い修正しました。 これから良心的な質問をするように心がけます。
guest

回答1

0

ベストアンサー

bにはdt内の1行分の[項目名]=[値]が格納されるわけですよね。
であれば、bへの格納処理のはじめにある

For y As Integer = 0 To dt.Columns.Count - 1

の直前にbをNewしてやる必要があります。

現状のコードではcにAddした後も同じオブジェクトを「使いまわす」ようになっているので、2レコードめのAddの時点で「そのkeyはもう存在する」エラーが発生するわけです。

投稿2017/11/17 07:33

cauliflowerjoe

総合スコア102

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xss

2017/11/17 07:55

cauliflowerjoeさん回答ありがとうございます。 ごもっともな状況です。 b = = New Hashtableにすると初期化して回すことが出来ました。 ですが、dにaddすると、格納した値も初期化されてしまいます。 元々の作りが悪いのでしょうか? よろしければご回答お待ちしております。
xss

2017/11/17 09:18

cauliflowerjoeさんごめんなさい、自分が初期化する場所を間違えていました。 正しかったです。 あとRow(0)の固定値のせいで同じ内容が繰り返し格納されていました。 回答ありがとうございました。感謝です。
cauliflowerjoe

2017/11/17 09:21

あっごめんなさい、Row(0)に関しては私も気づきませんでした・・正しくはRow(x)ですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問