2017-09-05 48 views
1

假設我有下面的類聲明中的參數的構造:VB.NET:使用迭代器,ObjArray.Select(功能(a)中a.Property),以驅動一個創建不同的對象陣列

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 

餘可使用便利地加寬操作者實現非常可讀初始化初始化的這些陣列,在這種情況下:

Dim u As MyObjectR() = New MyObjectR() {"a", "b", "c", "d"} 

在這一點上,我有MyObjectR的陣列。

假設我現在下面的類聲明添加到我的範圍:

Public Class MyObjectS 
     Private mStr As String 
     Public Sub New(ByVal _Var1 As String) 
      mStr = _Var1 
     End Sub 
    End Class 

現在,我想創建和初始化用相同數量MyObjectS的新數組在我之前MyObjectR的陣列和每個MyObjectS通過使用MyObjectR的特定屬性進行初始化。

如在下面的代碼行隱含(其不是用於VB.NET可接受語法):

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

在這裏,我想以某種方式使用迭代喂連續使用參數化的新的MyObjectS來創建它們的數組。當然,上面的語法行不正確。 (對於任何考慮這個想法的人,我需要補充一點,我不想在這裏涉及使用擴展運算符(即使可能),因爲MyObjectS可能是一個我不控制的類對象,也可以做不想用方法修改,例如,它可能是一個ListViewItem [它確實有一個參數化的New接受字符串。]因此,它不一定是我自己的對象,我可以叮叮噹噹。)

顯然,語法並不像我想在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(Function(a)a.MyProperty).Cast(Of MyObjectS).ToArray()'工作嗎? – Ryan

回答

1

你需要的代碼

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

只有一條線路只需要求選擇迭代器使用MyObjectR.MyProperty作爲參數來建立一個新的MyObjectS爲輸入序列的每個元素MyObjectS構造函數。最後,您可以使用ToArray實現結果序列。

+0

謝謝!我覺得soooooo愚蠢! ;) – jonk