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)来完成它。有一些很好的性能原因,如果没有其他的话。
你需要的代码
Dim v As MyObjectS() = u.Select(Function(a) New MyObjectS(a.MyProperty)).ToArray()
只有一条线路只需要求选择迭代器使用MyObjectR.MyProperty作为参数来建立一个新的MyObjectS为输入序列的每个元素MyObjectS构造函数。最后,您可以使用ToArray实现结果序列。
谢谢!我觉得soooooo愚蠢! ;) – jonk
Dim v = u.Select(Function(a)a.MyProperty).Cast(Of MyObjectS).ToArray()'工作吗? – Ryan