C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 64 を表示中)
■36830 / )  Re[1]: Dictionary.containskeyを使ったキーの存
□投稿者/ よねKEN (345回)-(2009/06/06(Sat) 15:48:30)
> 上記のようにハッシュテーブルにキーと値を入れ込み、
> ContainsKeyにてキーの存在チェックをしているのですが、何故かFalse判定になってしまいます。
> 理由がさっぱり分かりません。どうかよろしくお願い致します。

(1)クラス商品keyでGetHashCodeメソッドをオーバーライドしていない。
(2)商品マスタの商品keyプロパティは毎回異なる(商品keyクラスの)インスタンスを返している。

の2点が原因ですね。

提示のコード中の
> dic(商品.商品key) = 商品

ここの商品.商品keyと

> If dic.ContainsKey(商品.商品key) Then

ここの商品.商品keyとは(フィールドのJANコードの文字列が同じである)異なるインスタンスを使用しています。
つまり、別のキー を使っているのでDictionaryに見つからないという結果になります。

Dictionaryなどのハッシュテーブルでは、キーに利用するクラスのGetHashCodeメソッドの値をキーとして使います。
(1)によりクラス商品keyのGetHashCodeメソッドは、ObjectのGetHashCodeメソッド実装を使われます。
ObjectのGetHashCodeメソッドがどんな値を返すかは保証されていません。
(ただし現状提供されているObjectクラスの実装では、同じインスタンスなら、同じ値を返し、
異なるインスタンスでは異なる値を返すようにはなっています)

(2)の理由により、商品.商品keyが毎回異なるインスタンスを返すので、提示のコードではContainsKeyはFalseにしかなりません。

返信 編集キー/


管理者用

- Child Tree -