VB.NET:使用迭代器,ObjArray.Select(功能(a)中a.Property),以驱动一个创建不同的对象阵列

问题描述:

假设我有下面的类声明中的参数的构造: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

你需要的代码

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

只有一条线路只需要求选择迭代器使用MyObjectR.MyProperty作为参数来建立一个新的MyObjectS为输入序列的每个元素MyObjectS构造函数。最后,您可以使用ToArray实现结果序列。

+0

谢谢!我觉得soooooo愚蠢! ;) – jonk