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

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

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

Re[3]: 値が格納されたList(Of T)のインスタンス作成


(過去ログ 99 を表示中)

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

■59440 / inTopicNo.1)  値が格納されたList(Of T)のインスタンス作成
  
□投稿者/ ペンタゴン (1回)-(2011/05/25(Wed) 19:42:17)

分類:[VB.NET/VB2005 以降] 

例えば、あるメソッドの引数の型がList(Of String)であった場合、
このメソッドに"3", "4", "5"の値が格納されたList(Of String)を渡したいときに、
これをそのまま引数に記載する方法はないでしょうか?
配列ならば、

New String() {"3", "4", "5"}

として値の格納された配列を作成することができ、これを応用すれば

New String() {"3", "4", "5"}.ToList

としてList(Of String)のインスタンスを作成できますので、これにより、例えば
TestFunc(Byval list_ as List(Of String))のようなメソッドがあれば、

TestFunc(New String() {"3", "4", "5"}.ToList)

とすれば目的は達成します。
ただ、配列にしたものをList(Of T)にする方法以外にもっとシンプルな方法は
ないでしょうか?
なお、VBのバージョンは2008です。
引用返信 編集キー/
■59441 / inTopicNo.2)  Re[1]: 値が格納されたList(Of T)のインスタンス作成
□投稿者/ よねKEN (719回)-(2011/05/25(Wed) 19:56:39)
No59440 (ペンタゴン さん) に返信
> 例えば、あるメソッドの引数の型がList(Of String)であった場合、
> このメソッドに"3", "4", "5"の値が格納されたList(Of String)を渡したいときに、
> これをそのまま引数に記載する方法はないでしょうか?

VB2010ならコレクション初期化子が使えますが、
VB2008だとやはり一度配列を介する必要があると思います。

提示された方法以外だとコンストラクタで、
New List(Of String)(New String() {"3", "4", "5"})
という形で作成できますが、配列を介している部分は変わりないですね。

> ただ、配列にしたものをList(Of T)にする方法以外にもっとシンプルな方法は

根本的な話としては、メソッドの処理の目的がパラメータで渡されたList(Of String)に対してAddやRemoveするのが目的でないのであれば、
メソッドの引数としてList(Of String)を使用しているのがあまりよい方法ではありません。

パラメータの型には、IEnumerable(Of String)かIList(Of String)かICollection(Of String)を使うとよいでしょう。
今回のご要望に対してならStringの配列か、Stringの配列にParamArrayを付けたものという選択肢もあります。

引用返信 編集キー/
■59443 / inTopicNo.3)  Re[2]: 値が格納されたList(Of T)のインスタンス作成
□投稿者/ ペンタゴン (2回)-(2011/05/25(Wed) 20:37:08)
よねKEN さん、コメントありがとうございます。
やはり配列を介さないとだめですか。

> 根本的な話としては、メソッドの処理の目的がパラメータで渡されたList(Of String)に対してAddやRemoveするのが目的でないのであれば、
> メソッドの引数としてList(Of String)を使用しているのがあまりよい方法ではありません。
>
> パラメータの型には、IEnumerable(Of String)かIList(Of String)かICollection(Of String)を使うとよいでしょう。
> 今回のご要望に対してならStringの配列か、Stringの配列にParamArrayを付けたものという選択肢もあります。

確かに、引数のList(Of String)の中身をメソッド内で操作するのでなければ、配列を使う法がいいですね。
ただ、過去に作成したメソッドでは、その頃のスキルがあまりなく(今もそうですがw)Listは便利だと思って
ガンガン使いまくり、生成したListをそのまま渡すようなメソッドを平気で作成していました。
また、複雑なオーバーロードのメソッドがあり、ParamArrayをつかったもメソッドを作成した後に、追加で別の意味をもつ配列を渡す
オーバーロードメソッドを作成しようとしたときに、型を判別するためにListで渡そう、というようなことがあり、このような複雑なことに
なってしまいました。
(確か、ParamArrayのオーバーライドメソッドとIEnumerable(Of T)のオーバーライドメソッドがあった場合、配列を渡すと
ParamArrayのオーバーライドメソッドが実行されたような気がしました。)
これもちゃんと設計すればもっとまともなものになったと思うのですが、スキルのなさの産物ですね。
引用返信 編集キー/
■59446 / inTopicNo.4)  Re[3]: 値が格納されたList(Of T)のインスタンス作成
□投稿者/ shu (726回)-(2011/05/26(Thu) 12:26:43)
2011/05/26(Thu) 12:31:49 編集(投稿者)
No59443 (ペンタゴン さん) に返信

こんな関数を1つ用意してみはどうでしょう?


    Public Function NewList(Of T)(ParamArray args() As T) As List(Of T)
        Return args.ToList
    End Function

これがあれば

TestFunc(NewList("3", "4", "5"))

とかけます。

TestFuncにオーバーロードで
Function TestFunc(ParamArray args() as String) as 〜
    return TestFunc(NewList(args))
End Function

を追加すれば
TestFunc("3", "4", "5")
と書くことも可能です。


ToListは使用してますが1つ用意してしまえば呼び出し自体はシンプルになります。

引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -