- PR -

VB.net : indexが0から始まるコレクションってありますか?

投稿者投稿内容
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2005-11-03 07:55
MSDNクラスライブラリリファレンスSystem.Arrayより

Type と次元の長さを指定して、下限を持つ多次元の Array を作成します。
[Visual Basic]
Overloads Public Shared Function CreateInstance( _
ByVal elementType As Type, _
ByVal lengths() As Integer, _
ByVal lowerBounds() As Integer _
) As Array

これではだめ?

他人と共有するライブラリ作ったりするとき、
GetLowerBoundとか使わないのでしょうか…?

あれ?なんか勘違いしてるかも。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-03 08:59
配列とコレクションでは違いますよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2005-11-03 09:04
えっと質問の回答ではなく、

引用:

mioさんの書き込み (2005-10-20 09:36) より:
そういえば、VB6.0以前はOption Baseという機能がありましたね。
私はCとかで作るほうが多かったから、おそらく全部0基底で作ってましたが…。
Dim a(3 To 5)も、.NETでは配列の使い方を変える以外どうしようもないのかな?
(個人的には使ったことないですが)



こっちのほうです。
Dimは配列でしたよね?

やっぱりなんかよくわかってないかも。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-03 09:33
れいさん。こんにちは。元質問者のジブです。

CreateInstanceって面白いですね。

たぶん使う局面は少なそうに思うんですが、たとえばコレクションでも自分で作るのなら
似たようなことはできます。

コード:
Public Class MyCollection
    Inherits System.Collections.CollectionBase

    Public CollectionBase As Integer

    Public Sub Add(ByVal obj As Object)
        MyBase.List.Add(obj)
    End Sub

    Default Public Property Item(ByVal Index As Integer) As Object
        Get
            Item = MyBase.List(Index - CollectionBase)
        End Get
        Set(ByVal Value As Object)
            MyBase.List(Index - CollectionBase) = Value
        End Set
    End Property

    Public Sub New()
        MyBase.new()
        CollectionBase = 0
    End Sub

    Public Sub New(ByVal NewCollectionBase As Integer)
        MyBase.new()
        CollectionBase = NewCollectionBase
    End Sub


    Public Shared Function CreateInstance(ByVal CollectionBase As Integer) As MyCollection
        CreateInstance = New MyCollection(CollectionBase)
    End Function

End Class



こういうクラスを作って、例えばこんな風に使う。

コード:
        Dim tCollection As MyCollection = MyCollection.CreateInstance(3)
        tCollection.Add("hello !!")

        MessageBox.Show(tCollection(3))



でも、こんな紛らわしいコレクションはないほうがよいわけなんですが。。。

互換性はしょうがないとしても、なんで
Dim tCollection as Collection とやると
Dim tCollection as System.BisualBasic.Collection になるような仕様になっているんでしょうね。
別に互換モードにしているわけでもないはずなのに。

System.CollectionとかSystem.Collections.Collectionとかなんでないんだろうというのが最初の疑問でした。

ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-03 10:36
引用:

れいさんの書き込み (2005-11-03 09:04) より:

Dimは配列でしたよね?


Dim 自体は配列ではないですよ。
この場合の Dimension は「次元」というよりは「寸法」「容積」という意味らしいです。

引用:

やっぱりなんかよくわかってないかも。


確かに、l To U になりました。
知らなかったです、勉強になりました。

が、流石にそのままキャストはできないみたいですね。
クラスで被せてしまえばそのまま利用できそうです。(混乱を招きますから控えるべきですけど...)

コード:

    Dim nArray1 As Array = Array.CreateInstance(GetType(String), 3)
    Dim nArray2 As Array = Array.CreateInstance(GetType(String), New Integer() {3}, New Integer() {5})

    Dim nStrings1 As String() = DirectCast(nArray1, String())   ' OK!
    Dim nStrings2 As String() = DirectCast(nArray2, String())   ' キャストミス


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-03 10:41
引用:

ジブさんの書き込み (2005-11-03 09:33) より:

なんで
Dim tCollection as Collection とやると
Dim tCollection as System.BisualBasic.Collection になるような仕様になっているんでしょうね。
別に互換モードにしているわけでもないはずなのに。


Microsoft.VisualBasic 名前空間がインポートされているからです。
(おそらく、ジブさんの場合はプロジェクト全体で)

つまり、省略時は、
 Dim tCollection As Microsoft.VisualBasic.Collection
になっているわけです。

引用:

System.CollectionとかSystem.Collections.Collectionとかなんでないんだろうというのが最初の疑問でした。


型のようなクラスとして、という意味でしょうか?
名が「CollectionBase」なのは、「型を厳密にすべき」という意味が込められているのかもしれません。

何でも、となると「System.Collections.ArrayList」が使えますからね。
String なら「System.Collections.Specialized.StringCollection」ですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-03 10:57
ちょっと私も勘違いしてたみたいです。

Arry.CreateInstanceは次元の設定のようでOptionBaseとかは関係ないみたいです。

コード:
        Dim nArray1 As Array = Array.CreateInstance(GetType(String), 3, 4)

        nArray1(0, 0) = "hello!!"
        MessageBox.Show(nArray1(0, 0))

        nArray1(3, 0) = "hello!!"         'err

ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-03 10:59
引用:

じゃんぬねっとさんの書き込み (2005-11-03 10:41) より:
Microsoft.VisualBasic 名前空間がインポートされているからです。
(おそらく、ジブさんの場合はプロジェクト全体で)



うっとうしいのではずしちゃってもよいですかね??

ちょっと怖いかな??

ちょっと実験してみよう。

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