を作成パラメータ化コンストラクタを駆動するために、反復子、ObjArray.Select(関数(A)a.Property)を使用すると、私は、次のクラス宣言があるとしますVB.NET:異なるオブジェクト配列
Public Class MyObjectR
Private mStr As String
Public Sub New(ByVal _Var1 As String)
mStr = _Var1
End Sub
Public Property MyProperty As String
Get
Return mStr
End Get
Set(value As String)
mStr = value
End Set
End Property
Public Shared Widening Operator CType(ByVal _Initializer As String) As MyObjectR
Return New MyObjectR(_Initializer)
End Operator
End Class
私はMyObjectRの配列を持って、この時点で
Dim u As MyObjectR() = New MyObjectR() {"a", "b", "c", "d"}
:私は、この場合には便利な非常に読みやすい初期化を達成するために拡大演算子を使用して、これらの配列を初期化することができます。
私は今、自分のスコープに次のクラス宣言を追加したとします
Public Class MyObjectS
Private mStr As String
Public Sub New(ByVal _Var1 As String)
mStr = _Var1
End Sub
End Class
今、私はMyObjectRの私の以前の配列と同じ数を持つMyObjectSの新しい配列を作成し、初期化したいと各MyObjectSは、MyObjectRの特定のプロパティを使用して初期化されます。ここ
Dim v As MyObjectS() = New MyObjectS() {u.Select(Function(a) a.MyProperty)}
、私は何とかパラメータ化の連続的使用を供給するために反復子を使用したい:(VB.NETのために許容される構文ではない)コードの次の行に暗示したよう
MyObjectSの新機能で、それらの配列を作成します。もちろん、上記の構文は正しくありません。
(考えている人は、可能ならば広げている演算子を使用する必要はないということを付け加える必要があります。なぜならMyObjectSは私が制御しないクラスオブジェクト例えば、それはListViewItem [パラメータ化されたNew accepting Stringを持っているかもしれません。]だから、必ずしも私の周りのオブジェクトである必要はありません。
明らかに、構文は、私がVB.NETで見たいと思うほど簡単ではありません。しかし、私はVB.NETのどこかに構文が存在すると思っています。私は単純にそれについて知らないだけです。
ここで私はまた、成功せずにしようとした(または成功を期待して)別のオプションです:
Dim v As MyObjectS() = New MyObjectS() {u.Select(Function(a) a.MyProperty).ToArray}
ただ、完全を期すために、私は簡単にそれをこの方法で行うことができます知っている:
Dim w As List(Of MyObjectS) = New List(Of MyObjectS)
For Each i As String In u.Select(Function(a) a.MyProperty)
w.Add(New MyObjectS(i))
Next
Dim v As MyObjectS() = w.ToArray
しかし、それを行うList(Of T)を作成する必要なしに同様の操作を実行できる新しい構文を学びたいと思います。パフォーマンスの理由がいくつかあります。
Dim v = u.Select(関数(a)a.MyProperty).Cast(Of MyObjectS).ToArray() 'は動作しますか? – Ryan