- PR -

ハッシュテーブルがクリアされない

1
投稿者投稿内容
seberg
常連さん
会議室デビュー日: 2005/03/03
投稿数: 28
投稿日時: 2005-03-28 23:24
こんにちは。
ハッシュテーブルについて悩んでおります。
以下のような記述箇所なのですが、

'☆ハッシュテーブル&リスト初期化
Dim htbGengo As Hashtable = New Hashtable
Dim aryGengo As ArrayList = New ArrayList

intCnt = 0

While drRec.Read()
htbGengo = New Hashtable

htbGengo.Add("KBNDTL", CType(drRec.Item("KBNDTL"), String))
aryGengo.Add(htbGengo)
intCnt = CType(intCnt + 1, Int32)
End While

このソースを実行すると、htbGengo.Addの時に、
項目は既に追加されています。辞書のキー"ccc" 追加のキー"ccc"
というエラーになってしまいます。
htbGengo.Clear()をhtbGengo = New Hashtableの次に
書いてみても解決しませんでした。

どなたか、解決方法ご存知でしたらご指導下さい。
よろしくお願いいたします。

【開発環境】
VB.net2003
OS Win2000SP4
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-03-29 06:28
諸農です。

解決方法ではないのですが、デバッグコードとしてAddメソッドの前にContainsKeyメソッドを使ってキーの存在確認を行ってみてはいかがですか。


それと、アップされているコードで「重複エラーの現象」が再現可能なんでしょうか?

コードを見る限りだと、

1.HashTableの変数宣言とインスタンスのセット
2.ArrayListの変数宣言とインスタンスのセット
3.drRecを順次読み込み、読み終わるまで以下を繰り返す
4.宣言されているHashTableの変数に新たにインスタンスをセット(←かなり謎)
5.新しいインスタンスのHashTableに「Key=KBNDTL、Value=drRecから読み込んだアイテム」をセットして格納(←キーが固定なのが謎)
6.新しいインスタンスのHashTableをArrayListに追加

なので、毎回HashTableを作成しているので(言い換えるなら、HashTableには1項目しか格納されていない)、Keyが重複するとは思えないんですよね。
というか、「ccc」ってどこから出てきたんですか?

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-03-29 10:08
1項目しか格納しないのにHashTableをなぜ使うのかが疑問です。
キーと値のペアでArrayListに格納したいだけなら
HashTableではなくてSystem.Collections.DictionaryEntryを使用されたほうがよろしいかと。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-30 07:32
> intCnt = CType(intCnt + 1, Int32)
 これも謎。intCntはInteger型(Int32型)ですよね?なぜにわざわざキャスト、しかも、CIntでなくCType?


> htbGengo.Add("KBNDTL", CType(drRec.Item("KBNDTL"), String))
 CStrでなくCTypeですか?DataReader.GetStringというのもありますが?
 Nothingチェックは不要ですか?

 キャストはコストの高い操作なので、使用しないでいいなら使用しない方がいいです。まぁ、上のIntegerについては、コンパイラが最適化するときに外してくれるでしょうけど。


> aryGengo.Add(htbGengo)
 おそらく、キーをしまっておこうとしているのだと思いますが、HashTable.Keysで取れるので不要です。

_________________
seberg
常連さん
会議室デビュー日: 2005/03/03
投稿数: 28
投稿日時: 2005-04-01 21:18
ご指摘ありがとうございました。
当初複数件のレコード取得を予定していたので、
レコードはhashtableに格納、ということしか頭に無く
余計な処理を加えすぎていました。

もっと単純になるよう書き直します。
御礼が遅くなりすみません。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)