VB.NET:使用迭代器,ObjArray.Select(Function(a) a.Property),来驱动创建不同对象数组的参数化构造函数

VB.NET: Using an iterator, ObjArray.Select(Function(a) a.Property), to drive a parameterized constructor that creates a different object array

假设我有以下 class 声明:

    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 数组。

假设我现在将以下 class 声明添加到我的范围:

    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 的参数化 New 来创建它们的数组。当然,上面这行语法是不正确的。

(对于考虑这个想法的任何人,我需要补充一点,我不想在这里涉及扩大运算符的使用 [即使可能] 因为 MyObjectS 很可能是一个 class 我不知道的对象t 控制,也不想用方法修改。例如,它可能是一个 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) 来执行此操作。有一些好的性能原因,如果没有其他的话。

只需要一行代码

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

您只需要求 Select 迭代器使用 MyObjectR.MyProperty[ 为输入序列的每个元素构建一个新的 MyObjectS 作为 MyObjectS 构造函数的参数。最后,您可以使用 ToArray.

实现结果序列