2017-09-05 8 views
1

を作成パラメータ化コンストラクタを駆動するために、反復子、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)を作成する必要なしに同様の操作を実行できる新しい構文を学びたいと思います。パフォーマンスの理由がいくつかあります。

+0

Dim v = u.Select(関数(a)a.MyProperty).Cast(Of MyObjectS).ToArray() 'は動作しますか? – Ryan

答えて

1

あなたは単にMyObjectSにパラメータとしてMyObjectR.MyPropertyを使用して入力シーケンスの各要素のための新しいMyObjectSを構築するために選択イテレータを尋ねるコード

Dim v As MyObjectS() = u.Select(Function(a) New MyObjectS(a.MyProperty)).ToArray() 

は1行だけを必要としますコンストラクタ。最後に、得られたシーケンスをToArrayで実現することができます。

+0

ありがとう!私はそんなに愚かな気がする!! ;) – jonk

関連する問題