- - PR -
ハッシュテーブルがクリアされない
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 |
|
投稿日時: 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/ |
|
投稿日時: 2005-03-29 10:08
1項目しか格納しないのにHashTableをなぜ使うのかが疑問です。
キーと値のペアでArrayListに格納したいだけなら HashTableではなくてSystem.Collections.DictionaryEntryを使用されたほうがよろしいかと。 |
|
投稿日時: 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で取れるので不要です。 _________________ |
|
投稿日時: 2005-04-01 21:18
ご指摘ありがとうございました。
当初複数件のレコード取得を予定していたので、 レコードはhashtableに格納、ということしか頭に無く 余計な処理を加えすぎていました。 もっと単純になるよう書き直します。 御礼が遅くなりすみません。ありがとうございました。 |
1