プロが教えるわが家の防犯対策術!

VB.Net の初学者です。
Sub Main() でのデータ型、演算子、式等の確認をしているレベルです。

今回の質問は、ArrayList の疑似的な2次元配列でのエラーの回避要領についてです。

'Option Strict On

' ==============================
' FileReadToArrayLists のテスト
' ==============================
Sub Main()
  Dim aAttachs As New ArrayList

  FileReadToArrayLists("D:\Temp\付属一覧.csv", aAttachs)
  Debug.Print(aAttachs(0)(0))
  Debug.Print(aAttachs(0)(1))
  Debug.Print(aAttachs(0)(2))
  Debug.Print(aAttachs(0)(3))
End Sub

[イミディエイト ウインドウ]
品番001
品番001用付属1
品番001用付属2
品番001用付属3

==========================================================
Option Strict On では遅延バインディングを使用できません!
==========================================================

>Array には複数の次元を指定できますが、
>ArrayList または List<(Of <(T>)>) の次元は常に 1 次元です。

「もし、もしではあるが、配列そのものをリストの項目としたら・・・」
「それも 1 次元じゃーないか・・・」

と、考えたまでは良かったのですが・・・。
上記のエラーの回避要領がわかりません。

A 回答 (2件)

>「厳密に!」を重視して


嬉しいねぇ

>List コレクション型では成功しましたがArrayList コレクション型では失敗。この辺りは、どうなんでしょうか?

んー、C#にはArrayList<T>ってのは無いんだよね。
List<T>とかArrayListはあるけど。

Javaは逆にArrayList<T>はあるけど
List<T>ってのはインターフェースであって
クラスじゃない(ちなみにC#のインターフェースはIList<T>)

#ただ単にライブラリ製作者の名前の付け方の考え方が違うだけだと思う。
    • good
    • 0
この回答へのお礼

>「厳密に!」を重視して
嬉しいねぇ

意味ありげなoptionを書かれれば・・・。
しかし、全てのプロジェクトを消して40日のメモを見てのやり直し。
結構、大変でした。
しかし、型の理解に関する中途半端さを思い知ることができました。

#ただ単にライブラリ製作者の名前の付け方の考え方が違うだけだと思う。

ここで決着します。
いずれにしろ、List を使えば良いわけですから・・・。

ありがとうございました。

お礼日時:2009/03/10 12:06

うん、やっぱり一発で何が聞きたいか読み取れない



>「もし、もしではあるが、配列そのものをリストの項目としたら・・・」
>「それも 1 次元じゃーないか・・・」

そこまでは問題ないんじゃないの?
http://oshiete1.goo.ne.jp/qa4752021.html
の時はそういうつもりで書いているし。

これかなあ…聞きたいのって。
===========
何故エラーになるのか:

http://msdn.microsoft.com/en-us/library/system.c …

戻り値がObjectであって,配列やArrayListじゃないから,
自分で変換しないといけない。


Option Explicit On
Option Strict On
Option Compare Binary
Option Infer Off

Class Q4781160
Shared Sub Main()
Dim x As System.Collections.ArrayList
Dim y As String() = {"その1","その2"}
x = New ArrayList()
x.Add(DirectCast(y,Object)) '実際には継承元にはDirectCastを使わなくて良い
System.Console.WriteLine(DirectCast(x(0),String())(0))
System.Console.ReadKey(True)

'でいちいち変換するのが嫌だから
Dim z As System.Collections.Generic.List(Of String())
z = new System.Collections.Generic.List(Of String())()
z.Add(y)
System.Console.WriteLine(z(0)(0))
'というような構文が.NET 2.0から導入されたわけ。
'

End Sub
End Class

'という風に。Q4752021でもこの構文を使っている。
    • good
    • 0
この回答へのお礼

' =================================
' FileReadToArrayLists のテスト2
' =================================
Module theFileReadToArrayLists
  Sub Main()
    On Error Resume Next
    Dim I As Integer
    Dim N As Integer
    Dim aAttachs As New ArrayList

    FileReadToArrayLists("D:\Temp\付属一覧.csv", aAttachs, , True)
    Debug.Print(DirectCast(aAttachs.Item(1), String())(0))
    Debug.Print(DirectCast(aAttachs.Item(1), String())(1))
    Debug.Print(DirectCast(aAttachs.Item(1), String())(2))
    Debug.Print(DirectCast(aAttachs.Item(1), String())(3))
  End Sub
End Module

[イミディエイト ウインドウ]
品番001
品番001用付属1
品番001用付属2
品番001用付属3

成功しました。

ここ5日間は、ともかく回答にある「厳密に!」を重視して40日の演習を全てやり直しました。
その中で、質問にあるエラーに遭遇しました。
そうして、質問に至った次第です。

>戻り値がObjectであって,配列やArrayListじゃないから・・・

ここまでは気が付きましたが・・・。
しかし、其の先の何がなにやらサッパリでした。

「奇を衒った関数を作ったのが誤り」という結論で納得しつつありました。
そういう意味では、本当にありがとうございます。

なお、十分には理解してはいませんが、疑似的2元配列ですと BinarySearch メソッドに使えるようです。
そういう意味でも、本当にありがとうございます。


>'でいちいち変換するのが嫌だから
>Dim z As System.Collections.Generic.List(Of String())
>z = new System.Collections.Generic.List(Of String())()
>z.Add(y)
>System.Console.WriteLine(z(0)(0))
>'というような構文が.NET 2.0から導入されたわけ。

この回答は、真っ先に試しました。
しかし、 List コレクション型では成功しましたがArrayList コレクション型では失敗。
この辺りは、どうなんでしょうか?

お礼日時:2009/03/09 19:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A