- PR -

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

投稿者投稿内容
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-11-30 19:06
引用:

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


確かに悪くないですね。

ところで、列挙の順序を保障したい、となると話が変わってきますね。
私が示した方法だと順序が保障されないでしょう。(多分)

以前別スレッドでも言いましたが、「ハッシュテーブル」と「順序」は相容れません。
そう考えると、R・田中一郎さんが提示した方法はハッシュテーブルと順序をうまく共存させようとしてますね。

_________________
囚人のジレンマな日々
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-11-30 19:28
引用:

todoさんの書き込み (2005-11-30 18:51) より:
ただし、Keyによる検索の高速化が重要でなければ、ArrayList2本で十分でしょう。

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


なんか「割と最近、似たようなスレッドがあったような…」と思っていたら、スレ主が同じ人だったんですね。

しかし何で「ArrayList2本」案は却下されたんだろう? 速度的にそれ程差が出るもんなんでしょうか…?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-11-30 19:57
引用:

ところで、列挙の順序を保障したい、となると話が変わってきますね。
私が示した方法だと順序が保障されないでしょう。(多分)


はい。一応、試してみたんですが、予想通り順番がバラバラになってしまったので、元に戻しました。

コード:

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


こうやって書ける事がわかったので、もう何も怖くありません。
囚人さん、本当にありがとうございました。

引用:

なんか「割と最近、似たようなスレッドがあったような…」と思っていたら、スレ主が同じ人だったんですね。


いつバレるかとヒヤヒヤしていました。
それと、ちょっと間が空いてしまったので、ずっと同じところで悩み続けていたと思われてしまうと、言い訳するのが大変だと思ったものですから黙っていました。

引用:

しかし何で「ArrayList2本」案は却下されたんだろう? 速度的にそれ程差が出るもんなんでしょうか…?


却下なんて偉そうなものではないんです。
ArrayList2本ってどういう意味だかよくわからなかったんです。

#なにやら会議室の動きが軽くなったんですが、皆さん帰っちゃったんでしょうか。
#今日は、いろいろとありがとうございました。お疲れ様でした。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-11-30 22:13
引用:

R・田中一郎さんの書き込み (2005-11-30 18:56) より:
引用:

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



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




コレクションしたいだけでアクセスはFor EachかIndexのみで良い時はCollectionBase、
それに加えて任意のキーでアクセスしたい時は、DictionaryBaseを使っています。
何故、使っているのかといわれたら、コレクションするための基本的な機能が
既に盛り込まれているため後は、それぞれの型に特化したインタフェースを用意するだけで良いからです。
このあたりは、それぞれ、いろんな人によって好みがあると思いますので、
MSDN等で、それぞれの性質の差異を理解して、取捨選択されると良いと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-12-01 06:24
引用:

R・田中一郎さんの書き込み(2005-11-30 15:29)より:

でも、まとめクラスのデータストアとして hashtable を使うと、IEnumerator で内部的にカレントな要素数を管理しても直接アクセスできないので、やはり arraylist にも同時にオブジェクトを格納するようにしていますが、この方法しかないのでしょうか?
皆さんはどうしているんでしょう。


 だから、リファレンスを参照して、それぞれのクラスの特徴を確認した上で、使うんです。

SortedList クラス
NameObjectCollectionBase クラス を実装
扱うのが文字列なら、NameValueCollection クラス
辺りでしょうか。

 とりあえず、ブログでまとめました。→ http://blogs.wankuma.com/jitta/archive/2005/12/01/19755.aspx
___________________________________________________________________
□ written by Jitta on 2005/11/30
□ Microsoft MVP for Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-01 11:27
引用:
コレクションしたいだけでアクセスはFor EachかIndexのみで良い時はCollectionBase、
それに加えて任意のキーでアクセスしたい時は、DictionaryBaseを使っています。


ありがとうございました。凄くよくわかりました。
僕も今後はその方向でいこうと思います。

引用:
MSDN等で、それぞれの性質の差異を理解して、取捨選択されると良いと思います。


そうですね。
一応読んでから質問しているんですが、今の時点では、まだあまり理解できないので、どうしても、こちらにお世話になってしまいます。

引用:
だから、リファレンスを参照して、それぞれのクラスの特徴を確認した上で、使うんです。

SortedList クラス



実は SortedList クラスは、昨日自力で発見して使うことを検討していたんですが、ややこしそうだったので自作の方針でいくことにしました。
今のところ、MSDNライブラリを読んでも日本語に見えない(本当に英語だったりもしませが)状態です。
それでも昨日 SortedList クラスが発見できて、ややこしそうだという判断ができたことは、僕自身かなり満足な成長ぶりだと思いました。

引用:
 とりあえず、ブログでまとめました。→ http://blogs.wankuma.com/jitta/archive/2005/12/01/19755.aspx
SIZE="1" WIDTH="100%">

これを読んで思ったのですが、今後、MSDNライブラリは、Jittaさんに書いてもらうことにします。

ちなみに、問題の箇所ですが、問題なく動作しました。速度も問題ありません。
コードも非常にわかりやすくて、かなり満足しています。
本当に皆さんありがとうございました。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2005-12-01 12:44
結局どういう風に解決したんですか??
ずっと読んでたのですが、結末が抜け落ちた物語を読んだみたいな感じで気になります。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-01 14:54
引用:

結局どういう風に解決したんですか??
ずっと読んでたのですが、結末が抜け落ちた物語を読んだみたいな感じで気になります。



arraylist,hashtableを内部に持って、IEnumerable インターフェースを実装しました。
参考になるかわかりませんが、サンプルコードを載せておきますね。

コード:
Friend Class まとめクラス 
  Implements IEnumerable
  Private _ハッシュ As Hashtable 
  Private _配列 As ArrayList 

  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 _配列.GetEnumerator
  End Function
End Class


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