情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 | 編集
このエントリーをはてなブックマークに追加 Clip to Evernote

C#(.NET)でハッシュテーブルを利用する方法の基本と注意点 このエントリーを含むはてなブックマーク

C#(.NET)でハッシュテーブルを利用するときに関するメモ

正直、msdnなどを見えればいいのですが、毎回みるのも面倒なので、基本的なことをここに書いておきます。以下、ジェネリクスを利用したハッシュテーブルを紹介し、ジェネリクスでない場合については触れません。特に制限された開発環境でない限り、ジェネリクスを利用しない意味はないと思われます。

ハッシュテーブルを実装したクラス

そもそもHashテーブルを表すインターフェースはIDictionary<TKey, TValue>。 実装されているクラスは、

  1. Dictionary<TKey, TValue>クラス
  2. SortedDictionary<TKey, TValue>クラス
の2つです。

データを保存(追加・格納)する方法

データを保存する方法は基本的に2つ。

  1. Add(TKey key, TValue value)メソッドを利用する
    シンプルな方法です。keyとvalueのペアを指定するだけ。すでに利用されているkeyに対してvalueを重複して追加しようとすると、ArgumentExceptionがスローされます。
  2. インデクサを利用する
    インデクサを利用するとは、
    dictionary["key"] = new TValue();
    こんな感じです。実際、このようにすると、Add("key", new TValue());と同じように追加されますが、実は、大きな違いがあります。それは、keyが重複していても、例外を返さず、上書きされるということです。例外が帰ってくるのが面倒だったり、そもそも重複していないかチェックするくらいなら、インデクサを使った方がいいでしょう。

データを取得する方法

データを取得する方法は2つ。

  1. Itemプロパティを利用する
    基本的な取得方法はこれ。Keyを指定すると、Valueが返ってきます。わかりやすい。ただし、C#においては、インデクサとして実装されていることに注意。
    TValue value = dictionary["key"];
    という書き方で利用します。インテリセンスを利用して「Dictionaryから要素を取得するメソッドがないぞ?」と思った人。インデクサだから見つからないわけです。
  2. TryGetValueメソッドを利用する
    これは、Keyに対応する値が、保存されているかあやしい場合に利用します。Itemプロパティを利用すると、Keyに対応する値がない場合例外が返されて余計な時間がかかってしまいます。そこで、Keyに対応する値が保存されていない場合が多いと考えられるときはTryGetValueを利用します。このメソッドは例外を返さないので、オーバーヘッドが小さくできます。例外を返さない代わりに、値が保存されていないときは規定値(0, false, null)が返ってきます。

データを削除する方法

追加、取得、ときたら、削除ですね。削除する方法は1つ。

  1. Remove(TKey key)メソッドを利用する。 keyに対応するエントリ(key-valueペアのこと)を削除するには、
    dictionary.Remove("key");
    とすればよいことになります。削除できたときtrueを返します。また、削除できなかったとき、特に、keyが見つからないとき、falseを返します

まとめ

基本的な操作は、以上のメソッドやプロパティで行えます。特に、インテリセンス(コード補完機能)にたよっていると、インデクサの存在に気づけないこともあるので、注意が必要です。

それぞれの項目についての詳細は、リンク先のmsdnライブラリをご覧ください。リンク先は、.NET Framework 3.5 になっていますが、リンク先から別バージョンへ簡単に移動できます。

.NET | コメント:0 | トラックバック:0 | 編集
このエントリーをはてなブックマークに追加 Clip to Evernote

この記事のコメント

コメントの投稿 エントリの新旧に関わらず、極力18時間中に返信します。














この記事のトラックバック

トラックバックURL:
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。