- PR -

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

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-12-01 19:00
引用:

R・田中一郎さんの書き込み(2005-12-01 11:27)より:

今のところ、MSDNライブラリを読んでも日本語に見えない(本当に英語だったりもしませが)状態です。


 情報の取捨選択をしましょう。
 とりあえず、今のあなたに必要なのは、列挙の方法だけですよね。私は、あなたのその要望に沿う情報だけ、並べています。なので、あなた(の今の目的)にとってはわかりやすいのです。しかし、「検索の速さ」や「使用メモリ量」という情報を求める人には、「なんの情報もない」ことになります。


 蒸し返すようで申し訳ないですが、、、
 単に CollectionBase や ReadOnlyCollectionBase から継承して、
コード:
Default Property Item(Index As Integer) As 個別クラス
	Get
		Return List(Index);
	End Get
End Property

Default Property Item(Keyword As String) As 個別クラス
	Get
		For Each one As 個別クラス In List
			if keyword = one.頭文字 Then Return one;
		Next
	End Get
End Property


でもよさげ。Hashtable を使う必要があるのか、ってところが問題。

 または、「番号」を持たせていて、結局「Add した順」ではなく、この「番号順」に取り出したいわけなんだから、SortedList を使って、
コード:
Structure 個別クラス
	Implement IComparable
	...

	Public Overloads Function CompareTo(ByVal obj As Object) As Integer _
		Implements IComparable.CompareTo

		If TypeOf obj Is 個別クラス Then
			Dim itm As 個別クラス = CType(obj, 個別クラス)

			Return 番号.CompareTo(itm.番号)
		End If

		Throw New ArgumentException("object is not a 個別クラス")
	End Function


とか。番号の順にソートされるので、配列の添え字と"番号 - 1"が一緒になる。
 まぁ、GetEnumerator で取り出されるのが IDictionaryEnumerator なので、ちょっと処理が必要になるけど。
___________________________________________________________________
□ written by Jitta on 2005/12/01
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-01 20:03
引用:

情報の取捨選択をしましょう。


そうですね。おかげさまで、少しずつ読めるようになってきますた。
いろいろとサンプルコードをありがとうございました。
適材適所で使い分けると効率の良いコードが書けますね。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-12-01 21:41
引用:

Jittaさんの書き込み (2005-12-01 19:00) より:

Hashtable を使う必要があるのか、ってところが問題。



そうなんですよね。意外と難しい。

Hashtable を使う必要があるのかといわれれば、よくわからない。
でも使うデメリットはもっと思い浮かばない。

とりあえずStringなどはGetHashCodeを標準装備なのでKeyとしてOKOK

Keyがカスタムクラスの場合はGetHashCodeを実装しなければNG。
(私のケースはこっち)

それで、実際に速度とメモリー消費量を調べなくてはと思っていたところでした。
でも意外とこれがめんどくさい。

Hashtable を使うほどのサンプルデータを作成する手段が思いつかず
実データでやるのは情報交換の価値は少ない気もするし。

別件がたくさんあるので、とりあえず可もなく不可もなく動いているものに手を入れるのもためらわれ
とりあえずGetHashCodeを実装したところで、ペンディングとなっております。

そうとう大きいコレクションとかKeyアクセスが激しい(OnPaintなどで呼ばれまくるとかの)ケースでないと差は出ないように思えますが
かといってデメリットもまた思い浮かばない。

とはいえ、お好みでどうぞというのも、いまひとつすっきりしない。

ベンチマークの情報でもさがしてみようかな?

ちょっと脱線気味で申し訳ありません。
とても奥の深い話題で、投稿者様には感謝しています。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-12-01 22:21
引用:

ジブさんの書き込み (2005-12-01 21:41) より:

Hashtable を使う必要があるのかといわれれば、よくわからない。
でも使うデメリットはもっと思い浮かばない。

とりあえずStringなどはGetHashCodeを標準装備なのでKeyとしてOKOK


 いえ、okok ではないです、たぶん。

 問題は、「ハッシュ値」を算出するための「キー」を、「頭文字」としているところです。「人名」とか「商品名」だと思いますが、たとえば、、、

あい
あかね
あずさ
あき
あきこ
あおい

を格納しようとすると、「キー」がすべて「あ」になります。同じキーから導き出されるハッシュ値は同じでしょうから、衝突が多発することとなり、これではハッシュテーブルを使う意味がない、と思います。


 どんなデータを納めるのか書いていなかったので消したのですが、やっぱり気になりました(^^ゞ
___________________________________________________________________
□ written by Jitta on 2005/12/01
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-12-01 22:35
引用:

Jittaさんの書き込み (2005-12-01 22:21) より:

 いえ、okok ではないです、たぶん。

 :
(略)
 :

 どんなデータを納めるのか書いていなかったので消したのですが、やっぱり気になりました



あ、これは、私も気になっていたのですが、そもそも頭文字がキーになるわけはなく
ArrayListであっても同じことなので
多分適当な例が思い浮かばなかったんだろうなくらいに思っていました。

汎用的な事例を考えるのって結構難しいですよね。
でも、そういうことが結構勉強になったりしますし、抽象化能力の訓練になるのかもしれません。

ひとりで悩んでいると、ちょっとした盲点に嵌り込んだりすますし
掲示板でいろいろな視点からのご意見を伺うと大変参考になります。

あらら、また脱線してしまいました。失礼しました。

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