- PR -

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

投稿者投稿内容
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-30 17:55
おお!?
IEnumerable と IEnumerator を一つのクラスで実装するという発想はなかったなぁ。いいのかな。
(この場合は、サンプルのためかコンストラクタで値を設定しているのでまずそうですが)

で、ArrayList が何故必要なのかまだ分かりません。
ソースの方も「_配列」 と「_ハッシュ」がごちゃ混ぜになっているようですね。
確認しますが、「列挙したいのはキーではなく値の方」ですよね?

ぶっちゃけると
コード:

  Public Function GetEnumerator() As System.Collections.IEnumerator _
    Implements System.Collections.IEnumerable.GetEnumerator
    Return _ハッシュ.Values.GetEnumerator()
  End Function


こんな感じいけるはず。
IEnumerator は実装しなくてよろし。
内部は HashTable だけ持っていたらよろし。


_________________
囚人のジレンマな日々

[ メッセージ編集済み 編集者: 囚人 編集日時 2005-11-30 17:56 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-30 18:00
何も知らず以前の様に Collection クラスを多用していれば幸せだったのでしょう。
しかし、system.collection を知った時点で、これを使わなければ幸せな将来はありえないと思ったのです。

で、遅々なるも「hashtable を for each するには、わざわざ数値でアクセスできるように細工しなければならないのか?」という、あと一歩のところまで辿りついたのです。
絶対なにか良い方法がある筈だと思うのですが、未だにわかりません。

皆さんは、どうされているのでしょう。
それとも、根本的に、僕だけ何か外しているんでしょうか。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-11-30 18:09
引用:

R・田中一郎さんの書き込み (2005-11-30 18:00) より:
で、遅々なるも「hashtable を for each するには、わざわざ数値でアクセスできるように細工しなければならないのか?」という、あと一歩のところまで辿りついたのです。
絶対なにか良い方法がある筈だと思うのですが、未だにわかりません。

皆さんは、どうされているのでしょう。
それとも、根本的に、僕だけ何か外しているんでしょうか。


Hashtable.Valuesていってますやん…
あと、前にかかれてた(自前の)Enumeratorの実装はちょっとまずいです。
何がまずいって2回foreachしてみれば分かります。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-11-30 18:25
NAL-6295です。

私は、あるクラス専用のコレクションが欲しい時は、
場合によってCollectionBaseやDictionaryBaseを継承したクラスを作成しています。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-11-30 18:36
#脱線してしまいますが

VB6の癖が抜けないというのが理由ですが、
先の例はインデックスとキーの双方でアクセスかつForEachがAdd順に列挙できるというものです。
#当然そのような前提を意識してはいけないということはわかっております。
VB.NETに移行する際にSystem.Collectionsではそのような実装ができませんでした。
#実際Add順には列挙されなかった
で、先の例にしたらAdd順に列挙されました。

まぁいいやと使っておりましたが、いかんと思いForループに直さねばと思ってるところです。
自己反省も含め書かせていただきました。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-30 18:39
引用:

Hashtable.Valuesていってますやん…



またしても時差でした。
僕が一生懸命レスしていると、その間に、疾風のごとく返答をいただいたりするわけです。そうなると、より一層頭の悪い人に見えてしまうのが辛いところです。

で、この方法で、先ほど試してみたらうまく動きました。囚人さんありがとうございました。
回答がわかると一瞬で、何故こんなことでクヨクヨ悩んでいたんだろうと思います。

引用:

で、ArrayList が何故必要なのかまだ分かりません。



IEnumerator でカレント位置を得るために数値でアクセスできる必要があると思っていたからです。
それと、Add の順番を覚えておいて、その順番でアクセスさせたかったというのもあります。(理由としては、こっちの方がメイン)

#先ほど気がついたのですが、皆さん引用に特別なことをしているんですね。
#気がつけば僕も常連さんに昇格していることだし、僕もこの方法にしてみることにしました。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-11-30 18:51
> で、ArrayList が何故必要なのかまだ分かりません。

登録した順序を保持するのに使っているようです。

ハッシュテーブル(連想配列)を使うには?
引用:

なお通常の配列などと異なり、ハッシュテーブルでは格納した要素の順序は保持されない。このためキーや値や要素を列挙した場合に、どのような順で要素が取り出されるかは不定である。



> 絶対なにか良い方法がある筈だと思うのですが、未だにわかりません。

提示の方法はHashtableとArrayListを上手く使っていると思います。
ただし、Keyによる検索の高速化が重要でなければ、ArrayList2本で十分でしょう。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25965&forum=7

[ メッセージ編集済み 編集者: todo 編集日時 2005-11-30 18:57 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-30 18:56
引用:

VB6の癖が抜けないというのが理由ですが、



僕は、ほんの1時間前まで、保守契約のお客さんのシステムをいぢるのに VB6 のコードを書いていました。
このために、癖が抜けかけると、また元に戻ってしまう毎日です。
まとめて移植しちゃえばいいんでしょうけど、結構な仕事量だし、まだ発売されていない2005で作ったものを納品するのもちょっと勇気が必要です。

引用:

先の例はインデックスとキーの双方でアクセスかつForEachがAdd順に列挙できるというものです。



そうなんです。僕の中では、これが普通だと思っていたのです。

引用:

私は、あるクラス専用のコレクションが欲しい時は、
場合によってCollectionBaseやDictionaryBaseを継承したクラスを作成しています。



どうしてですか?
そのくらい自分で調べろと言われちゃいますね。すみません。
他にも、同じようなクラスがたくさんあって、変更しなければならないので、その時に使ってみます。

引用:

提示の方法はHashtableとArrayListを上手く使っていると思います。



ありがとうございました。少し自信がつきました。

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