- PR -

For Each で呼び出せるクラスを作りたいです

投稿者投稿内容
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-11-28 22:19
Hashtable使いたくて、かつ格納されているオブジェクトだけを取得してまわしたいなら、
Hashtable自体をforeachで使うんではなくて、Valuesプロパティを使えばよいでしょう。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-29 06:23
引用:

ジブさんの書き込み (2005-11-28 21:09) より:
引用:

Jittaさんの書き込み (2005-11-28 20:55) より:
ってか、何でみんな HashTable 使うん?
なんか、目的と手段がずれている気がする。



ValueObject = myCollection.Item( keyObject ) みたいな書き方するのには
みなさん、どうしていますか?


ああ、上の行に注目されても。。。
引用:

dim まとめ as new まとめクラス
for each 個別 as 個別クラス in まとめ ← ここで例外エラーがでます!!
  messagebox.show(個別.プロパティ)
next


ということなので、「key はいらないのでは?」と、思いました。


引用:

私はCollectionBaseで回していますけど
こんな時にHashTable 使うのかな?

どこかにガイドライン的なドキュメントありますか?



まとめは、MSDN なら「ガイドライン」で検索すればいいと思います。
が、それぞれのクラスに、それなりに「こんな時」という説明があったと思います。

とりあえず、ブログネタにします。

_________________
検索のコツ質問のコツ

[ メッセージ編集済み 編集者: Jitta 編集日時 2005-11-29 06:24 ]
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-29 23:11
灯台下暗し。。。でした。

http://www.atmarkit.co.jp/fdotnet/dotnettips/125hashtable/hashtable.html

引用:

ハッシュテーブルの特長は、指定したキーから、それに対応した値を高速に得られることである。



ArrayListでぶん回すより、よさそう。(どんな仕組みになっているのかな?)

でもEqualsのオーバーライドとの兼ね合いは勉強せねば。

「HashTable ガイドライン .Net」で検索したらこんな情報が。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpgenref/html/cpconimplementingequalsoperator.asp

引用:

Equals メソッドを実装するときは、必ず GetHashCode メソッドを実装します。



やばい。GetHashCodeって何??状態です。

そのうち調べなくては。。。。

脱線してしまいました。ごめんなさい。

[ メッセージ編集済み 編集者: ジブ 編集日時 2005-11-29 23:15 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-30 15:24
僕がhashtable を使った理由は、

>ValueObject = myCollection.Item( keyObject ) みたいな書き方するのには

そうです、こういうアクセスと、for each で全て回す場合の両方が使えるからです。

>ArrayListでぶん回すより、よさそう。(どんな仕組みになっているのかな?)

確か、ハッシュって、一定の計算式で算出したアドレスに値を格納するといったような古くからあるアクセス技法のことだったと思います。
ぶん回すのは検索ですが、ハッシュは探さないので速いってことでしょうか。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-30 15:29
>HushTableはAddするときにKeyとValueを与えます。

凄く納得しました。

先ほど、Implements IEnumerable, IEnumerator してみましたが、うまくいきました。
for each に関しては、理解できたと思います。
ついでにインターフェースってどういうものかも勿論理解しました。

でも、まとめクラスのデータストアとして hashtable を使うと、IEnumerator で内部的にカレントな要素数を管理しても直接アクセスできないので、やはり arraylist にも同時にオブジェクトを格納するようにしていますが、この方法しかないのでしょうか?
皆さんはどうしているんでしょう。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-30 15:44
HashTable 云々は、ただ列挙(順次参照)したいのか、キーを使って高速に一つの値を取得したいのか、によって変わってきますね。

Equals() をオーバーライドして、「等しい」の意味を変えているにもかかわらず、GetHashCode() をオーバーライドしない人や GetHashCode() をオーバーライドしないとコンパイラから警告がでるので、オーバーライドしてただ 基本型の GetHashCode() を呼んでいるだけの人がいますね。

そのようなクラスのオブジェクトを HashTable のキーにしてしまうと、さてどうなるでしょう。
#ハッシュテーブルのキーには値型や文字列を使うことが多いから、あまり深く考えない?

引用:

確か、ハッシュって、一定の計算式で算出したアドレスに値を格納するといったような古くからあるアクセス技法のことだったと思います。


その計算に使用するのが GetHashCode() ですね。

引用:

でも、まとめクラスのデータストアとして hashtable を使うと、IEnumerator で内部的にカレントな要素数を管理しても直接アクセスできないので、やはり arraylist にも同時

にオブジェクトを格納するようにしていますが、この方法しかないのでしょうか?


具体的にはどう実装してます?

_________________
囚人のジレンマな日々
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-30 16:54
>#ハッシュテーブルのキーには値型や文字列を使うことが多いから、あまり深く考えない?

はい、考えたことすらありません。
なので想像すらできませんでした。

>具体的にはどう実装してます?

データストア用に hashtable を、そのキーを arraylist に収めるやり方と、その逆。
で、今は両方に格納しています。
こんな感じ。

Friend Class まとめクラス
  Implements IEnumerable, IEnumerator
  Private _ハッシュ As Hashtable
  Private _配列 As ArrayList
  Private _index As Integer

  Public Sub New()
    _ハッシュ = New Hashtable
    _配列 = New ArrayList
    追加(1, "あ", "いうえお")
    追加(2, "か", "きくけこ")
    追加(3, "さ", "しすせそ")

    Reset()
  End Sub

  Deault Public ReadOnly Property Item(ByVal 頭文字 As String) As 個別クラス
    Get
      Return _ハッシュ(頭文字)
    End Get
  End Property

  Deault Public ReadOnly Property Item(ByVal 要素数 As Integer) As 個別クラス
    Get
      Return _配列(要素数)
    End Get
  End Property

  Public ReadOnly Property 件数() As Integer
    Get
      Return _ハッシュ.Count
    End Get
  End Property

  Private Sub 追加( _
ByVal 番号 As Integer, _
ByVal 頭文字 As String, _
ByVal データ As String _
)
    Dim c As 個別クラス = New 個別クラス(番号, 頭文字, データ)
    _ハッシュ.Add(頭文字, c)
    _配列.Add(c)
  End Sub

  Public Function GetEnumerator() As System.Collections.IEnumerator _
    Implements System.Collections.IEnumerable.GetEnumerator
    Return Me
  End Function

  Public ReadOnly Property Current() As Object _
    Implements m.Collections.IEnumerator.Current
    Get
      Return _配列.Values(_index)
    End Get
  End Property

  Public Function MoveNext() As Boolean Implements _
    System.Collections.IEnumerator.MoveNext
    If (_index < _配列.Count - 1) Then
      _index += 1
      Return True
    End If
    Return False
  End Function

  Public Sub Reset() Implements System.Collections.IEnumerator.Reset
    _index = -1
  End Sub
End Class
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-11-30 17:20
引用:

>ValueObject = myCollection.Item( keyObject ) みたいな書き方するのには

そうです、こういうアクセスと、for each で全て回す場合の両方が使えるからです。


VisualBasic名前空間のCollectionを使って
コード:
Public Class MemberCollections
    Implements IEnumerable

    Private MyCollection As New Collection

    Public Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
        Return MyCollection.GetEnumerator
    End Function

    Default Public Overloads ReadOnly Property Item(ByVal Index As Integer) As MyMember
        Get
            Try
                Return CType(MyCollection(Index), MyMember)
            Catch ex As Exception
                Return Nothing
            End Try
        End Get
    End Property
    Default Public Overloads ReadOnly Property Item(ByVal Key As String) As MyMember
        Get
            Try
                Return CType(MyCollection(Key), MyMember)
            Catch ex As Exception
                Return Nothing
            End Try
        End Get
    End Property
End Class


というのは邪道でしょうか?

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