- PR -

Hashtable のキー配列が欲しい

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-11 19:02
ヘルプを見ても調べてもわかりません・・・
どうすればゲットできますか?

こんな感じのクラスを作りたいんだけど。

public class こんな感じ
  Private _item As Hashtable = New Hashtable
  Public ReadOnly Property Item(ByVal Key As String) As Object
    Get
      Return _item.Item(Key)
    End Get
  End Property

  Public ReadOnly Property Item(ByVal Index As Integer) As Object
    Get
      'ここで根本的になにか勘違いをしているらしい・・・
      Dim a As Array
      _item.Keys.CopyTo(a, 0)
      Return a.GetValue(Index)
    End Get
  End Property

  :
  :
 つづく
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-11 19:20
こんにちは。

ご本人が間違っているであろうと思われているソースだけを見ても、何がなさりたいのか良くわかりません。

内部の実装は Hashtable に依存している「こんな感じ」クラスにインデックスを指定して値をとりたいのですか?
同じインデックスを指定したら毎回同じ値が取りたいと思うのですが、Hashtable だとそうはいかないんじゃあないですか?

Dim a As Array
インスタンスを作らないと、CopyTo() に渡せないとヘルプにあります。
そもそも Array は直にインスタンスを作れません。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-11 19:38
>内部の実装は Hashtable に依存している「こんな感じ」クラスにインデックスを指定して値をとりたいのですか?

そうです。
以下のような使い方ができれば、hashtable にはこだわらないんですが。

こんな感じ.add("キー1", "値1")
こんな感じ.add("キー2", "値2")
こんな感じ.add("キー3", "値3")

for i = 0 to こんな感じ.count - 1
  表示する(こんな感じ.Item(i))
next

表示する(こんな感じ.Item("キー1"))
表示する(こんな感じ.item("キー2"))
表示する(こんな感じ.item("キー3"))
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-11 19:47
引用:

以下のような使い方ができれば、hashtable にはこだわらないんですが。


Hashtable に順序などないので、Hashtable にはインデクサはないんでしょうね。
それでもキーを指定して「効率よく」取得したい、でも順序は一定であって欲しいとなると難しいのでは。

キーを指定して「効率よく」取得したいわけではないなら、内部の実装は普通のコレクション(ArrayListとかCollectionBaseの派生とか)にしておいて、
Public ReadOnly Property Item(ByVal Key As String) As Object
こっちの方を工夫してみては?

R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-11 19:57
そうですね。
やはり自作しかないのかー
ありがとうございました。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-11-11 20:04
R・田中一郎さん、こんばんは。

引用:

こんな感じ.add("キー1", "値1")
表示する(こんな感じ.Item(i))
表示する(こんな感じ.Item("キー1"))


判りにくいんですが、要は Microsoft.VisualBasic.Collection みたいにキーでもインデックスでもコレクションの要素にアクセス出来るようにしたい、って事でしょうか?
であれば、こんな感じ↓でどうでしょう?

コード:

Public Class MyCollection
    Implements ICollection

    Private Values As ArrayList = New ArrayList
    Private Keys As ArrayList = New ArrayList

    Public Function Add(ByVal key As Object, ByVal value As Object) As Integer
        Keys.Add(key)
        Return Values.Add(value)
    End Function

    Default Public ReadOnly Property Item(ByVal index As Integer) As Object
        Get
            Return Values(index)
        End Get
    End Property

    Default Public ReadOnly Property Item(ByVal key As Object) As Object
        Get
            Return Values(Keys.IndexOf(key))
        End Get
    End Property

End Class

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-11-11 21:05
NameObjectCollectionBase の派生クラスを自作すればできるんでないかな?たぶん。
要素とキーが文字列だけならNameValueCollectionでいいと思いますが。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-12 08:21
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemcollectionshashtableclassgetenumeratortopic.asp

単に for 文でまわすなら、列挙すればいいやん

って、ことじゃないの?
___________________________________________________________________
□ written by Jitta on 2005/11/12
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________

スキルアップ/キャリアアップ(JOB@IT)