C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Using parserで配列を使用したい

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■91685 / inTopicNo.1)  Using parserで配列を使用したい
  
□投稿者/ TanuTanu (37回)-(2019/07/20(Sat) 13:09:59)

分類:[.NET 全般] 

いつもお世話になっています。

Using parser As New TextFieldParser("C:\work\test.csv",Encoding.GetEncoding("Shift_JIS"))

で配列を使用して下記みたいな事をしたいのですが上手く出来ません。

Using parser(0) As New TextFieldParser("C:\work\test1.csv",Encoding.GetEncoding("Shift_JIS"))
Using parser(1) As New TextFieldParser("C:\work\test2.csv",Encoding.GetEncoding("Shift_JIS"))
Using parser(2) As New TextFieldParser("C:\work\test3.csv",Encoding.GetEncoding("Shift_JIS"))

ご存知の方、ご教授お願い致します。
引用返信 編集キー/
■91686 / inTopicNo.2)  Re[1]: Using parserで配列を使用したい
□投稿者/ キングダム (42回)-(2019/07/20(Sat) 14:06:35)
No91685 (TanuTanu さん) に返信

Using a As Newは変数aを宣言してそれにオブジェクトをセットします
parser(0)という変数を宣言できないので
Using parser(0) As Newはできないです

似たようなことをするにはどうしますかという話ですが

Dim parser(2) As TextFieldParser
parser(0) = New TextFieldParser("C:\work\test1.csv",Encoding.GetEncoding("Shift_JIS"))
parser(1) = New TextFieldParser("C:\work\test2.csv",Encoding.GetEncoding("Shift_JIS"))

Using parser(0)
  Using parser(1)
  End Using
End Using

↑こうするかもしくはもう配列を忘れて↓こうするとか

Using test1 As New TextFieldParser("C:\work\test1.csv", Encoding.GetEncoding("Shift_JIS")),
    test2 As New TextFieldParser("C:\work\test2.csv", Encoding.GetEncoding("Shift_JIS"))
End Using

引用返信 編集キー/
■91687 / inTopicNo.3)  Re[1]: Using parserで配列を使用したい
□投稿者/ 魔界の仮面弁士 (2250回)-(2019/07/20(Sat) 14:08:15)
No91685 (TanuTanu さん) に返信
> 配列を使用して下記みたいな事をしたいのですが上手く出来ません。

Using に配列を渡すことは出来ません。
Using を使わず、自分で Finally 句で Dispose しては如何でしょうか?


> Using parser(0) As New TextFieldParser("C:\work\test1.csv",Encoding.GetEncoding("Shift_JIS"))
> Using parser(1) As New TextFieldParser("C:\work\test2.csv",Encoding.GetEncoding("Shift_JIS"))
> Using parser(2) As New TextFieldParser("C:\work\test3.csv",Encoding.GetEncoding("Shift_JIS"))

カンマで区切って、複数の変数を宣言することはできます。
要素数は固定になってしまいますが、Using は入れ子にならず、単一のブロックになります。

 Dim sjis = Encoding.GetEncoding("Shift_JIS")
 Using p1 As New TextFieldParser("C:\work\test1.csv", sjis), _
    p2 As New TextFieldParser("C:\work\test2.csv", sjis), _
    p3 As New TextFieldParser("C:\work\test3.csv", sjis)

  Dim parser As TextFieldParser() = {p1, p2, p3}
  '  :
  '  略
  '  :
 End Using


もし、各パーサーを同時に使う必要が無いのなら、このように書くことができます。

 Dim sjis = Encoding.GetEncoding("Shift_JIS")
 For n = 1 To 3
  Dim csvPath As String = $"C:\work\test{n}.csv"
  Using parser As New TextFieldParser(csvPath, sjis)
  '  :
  '  略
  '  :
  End Using
 Next


各パーサーを同時に扱う必要があるのなら、Using を使えないので、
自分で Finally 句で Dispose することになるでしょう。

 Dim sjis = Encoding.GetEncoding("Shift_JIS")
 Dim parsers As New List(Of TextFieldParser)()
 Try
  For n = 1 To 3
   Dim csvPath As String = $"C:\work\test{n}.csv"
   parsers.Add(New TextFieldParser(csvPath, sjis))
  Next
  '  :
  '  略
  '  :
 Finally
  parsers.ForEach(Sub(o) o.Dispose())
  parsers.Clear()
 End Try



どうしても Using にまとめたければ、そのためのヘルパーを作るとか…?


 Dim parsers As New List(Of TextFieldParser)() From {〜}
 Using New Example(parsers)
  '
  'Debug.WriteLine(parsers(0).EndOfData)
  'Debug.WriteLine(parsers(1).EndOfData)
  'Debug.WriteLine(parsers(2).EndOfData)
  '
 End Using


Friend Class Example
 Implements IDisposable
 Private items As IEnumerable(Of IDisposable)
 Public Sub New(ByVal obj As IEnumerable(Of IDisposable))
  items = If(obj, New IDisposable(-1) {})
 End Sub
 Protected Overridable Sub Dispose(disposing As Boolean)
  If items IsNot Nothing AndAlso items.Any() Then
   If disposing Then
    For Each obj In items.Reverse()
     obj.Dispose()
    Next
   End If
   items = Nothing
  End If
 End Sub
 Public Sub Dispose() Implements IDisposable.Dispose
  Dispose(True)
 End Sub
End Class
引用返信 編集キー/
■91689 / inTopicNo.4)  Re[2]: Using parserで配列を使用したい
□投稿者/ TanuTanu (38回)-(2019/07/20(Sat) 16:23:12)
キングダムさん、魔界の仮面弁士 さん

ありがとうございます。

奥深いところ教えて頂きありがとうございます。

簡潔に書く方法探しててすっきりしました。

又、困った事がありましたら宜しくお願い致します。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ