tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: コレクションとハッシュテーブル
投稿日: 2006/12/20(Wed) 19:58
投稿者魔界の仮面弁士
> Dim hush As New Hashtable
「hush」だと、意味が変わってしまうような。

> Debug.Print(CStr(hush("c")))
コードの記述からして、VB2005 ですね?


> 何が違うのですか?
HashTable は、キーによる管理を行うためのクラスです。
ArrayList は、順序による管理を行うためのクラスです。
Collection は、順序による管理を重視しますが、キーによる管理もできます。


そもそも、Microsoft.VisualBasic.Collection の方は、キー指定は必須ではありませんが、
System.Collections.Hashtable は、キー指定が必須となっています。これが最大の違いです。

そのため Collection では、キーを指定して取得するだけでなく、「3番目の要素」といった、
位置指定での値取得が可能になっていますし、Add メソッドの Before/After 引数によって、
位置指定での値登録も可能となっています。
一方の HashTable は、キー主体で管理され、登録順についての指定はできません。


それから、登録された値の扱いも異なります。
Collection の場合、代入した値は固定的で、後から変更することが出来ませんが、
HashTable の方は、登録済みの値を変更することができます。

このため、HashTable では、
 hash("d") = "4444"
という「値の代入」が可能ですが、Collection で値を変更するには、
それを一度削除してから、再度登録しなおすという手順が必要となります。


それと、データの列挙時にも違いがあります。
Collection の内容を列挙する場合には、
  For I As Integer = 1 To col.Count
    Debug.Print("value={0}", col(I))
  Next
のように、「For 〜 Next」による、位置指定での『値の列挙』と、
  For Each o As Object In col
    Debug.Print("value={0}", o)
  Next
のように、「For Each 〜 Next」による『値の列挙』が可能です。
しかし「キーの列挙」機能は、持ち合わせていません。


一方、HashTable の場合は、「For 〜 Next」による指定ができません。そのかわりに、
  For Each o As DictionaryEntry In hash
    Debug.Print("key={0}, value={1}", o.Key, o.Value)
  Next
のように、値とキーを同時に列挙できますし、
  For Each o As Object In hash.Values
    Debug.Print("value={0}", o)
  Next
  For Each o As Object In hash.Keys
    Debug.Print("key={0}", o)
  Next
のように、キーと値を個別に列挙することもできます。



> 『あるキーを渡して、対応する値を取得する』という機能を実現したい場合、
> どちらを使う方が良いですか?

どちらでもなく、System.Collections.Generic.Dictionary の使用をオススメします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。