- - PR -
For Each で呼び出せるクラスを作りたいです
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-28 22:19
Hashtable使いたくて、かつ格納されているオブジェクトだけを取得してまわしたいなら、
Hashtable自体をforeachで使うんではなくて、Valuesプロパティを使えばよいでしょう。 | ||||||||||||||||
|
投稿日時: 2005-11-29 06:23
ああ、上の行に注目されても。。。
ということなので、「key はいらないのでは?」と、思いました。
まとめは、MSDN なら「ガイドライン」で検索すればいいと思います。 が、それぞれのクラスに、それなりに「こんな時」という説明があったと思います。 とりあえず、ブログネタにします。 _________________ 検索のコツ・質問のコツ [ メッセージ編集済み 編集者: Jitta 編集日時 2005-11-29 06:24 ] | ||||||||||||||||
|
投稿日時: 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
やばい。GetHashCodeって何??状態です。 そのうち調べなくては。。。。 脱線してしまいました。ごめんなさい。 [ メッセージ編集済み 編集者: ジブ 編集日時 2005-11-29 23:15 ] | ||||||||||||||||
|
投稿日時: 2005-11-30 15:24
僕がhashtable を使った理由は、
>ValueObject = myCollection.Item( keyObject ) みたいな書き方するのには そうです、こういうアクセスと、for each で全て回す場合の両方が使えるからです。 >ArrayListでぶん回すより、よさそう。(どんな仕組みになっているのかな?) 確か、ハッシュって、一定の計算式で算出したアドレスに値を格納するといったような古くからあるアクセス技法のことだったと思います。 ぶん回すのは検索ですが、ハッシュは探さないので速いってことでしょうか。 | ||||||||||||||||
|
投稿日時: 2005-11-30 15:29
>HushTableはAddするときにKeyとValueを与えます。
凄く納得しました。 先ほど、Implements IEnumerable, IEnumerator してみましたが、うまくいきました。 for each に関しては、理解できたと思います。 ついでにインターフェースってどういうものかも勿論理解しました。 でも、まとめクラスのデータストアとして hashtable を使うと、IEnumerator で内部的にカレントな要素数を管理しても直接アクセスできないので、やはり arraylist にも同時にオブジェクトを格納するようにしていますが、この方法しかないのでしょうか? 皆さんはどうしているんでしょう。 | ||||||||||||||||
|
投稿日時: 2005-11-30 15:44
HashTable 云々は、ただ列挙(順次参照)したいのか、キーを使って高速に一つの値を取得したいのか、によって変わってきますね。
Equals() をオーバーライドして、「等しい」の意味を変えているにもかかわらず、GetHashCode() をオーバーライドしない人や GetHashCode() をオーバーライドしないとコンパイラから警告がでるので、オーバーライドしてただ 基本型の GetHashCode() を呼んでいるだけの人がいますね。 そのようなクラスのオブジェクトを HashTable のキーにしてしまうと、さてどうなるでしょう。 #ハッシュテーブルのキーには値型や文字列を使うことが多いから、あまり深く考えない?
その計算に使用するのが GetHashCode() ですね。
具体的にはどう実装してます? _________________ 囚人のジレンマな日々 | ||||||||||||||||
|
投稿日時: 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-11-30 17:20
VisualBasic名前空間のCollectionを使って
というのは邪道でしょうか? |