掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Generics.Collections.TDictionary の ContainsValue (ID:40015)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
AddでTDictionary内に格納される際、Cityそのものではなくそのコピーが格納されます。 この時点でCityとDictionary['ロンドン']は別物になります。 一方で、City2はDictionary['ロンドン']そのものが返されるため同一になります。 また、TDictionaryのTValueの比較は外部から比較方法を用意する手段がなく、 自動的にTEqualityComparer<TValue>.Defaultが比較関数として使用されます。 今回のrecordの場合は内容をバイナリとしてみた単純比較になりますので、 内部的には単なるポインタであるstringを比較した場合、 中身の文字列が同じであろうとポインタの指す場所が違えばFalseが返ります。 この処理内ではオーバーライドされた演算子を使用しませんので、 オーバーライドしても結果は変わりません。 これを解決する方法はいくつかあります。 stringの部分を静的なChar配列に変更することでも期待した値が返りますし、 TCityをキーとしたTDictionaryをもう一つ作り、 Create時の引数でComparerを渡してやることでも解決可能です。 ただし、ハッシュ値で高速に検索可能なContainsKeyに対し、 ContainsValueはforで順番に調べているだけなので低速です。 頻繁にContainsValueを呼ぶ可能性がある場合は後者をお勧めします。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.