Supposons que j'ai la déclaration de classe suivante:VB.NET: L'utilisation d'un itérateur, ObjArray.Select (Fonction (a) a.Property), pour conduire un constructeur qui crée un paramétrés tableau d'objets différents
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
Je peux initialiser un tableau de ceux-ci, dans ce cas, l'utilisation pratique de l'opérateur pour obtenir un élargissement de l'initialisation très lisible:
Dim u As MyObjectR() = New MyObjectR() {"a", "b", "c", "d"}
à ce stade, j'ai un tableau de MyObjectR.
Supposons que j'ajoute maintenant la déclaration de classe suivante à mon champ:
Public Class MyObjectS
Private mStr As String
Public Sub New(ByVal _Var1 As String)
mStr = _Var1
End Sub
End Class
Maintenant, je voudrais créer et initialiser un nouveau tableau de MyObjects avec le même nombre que dans mon tableau avant de MyObjectR et où chaque objet MyObjectS est initialisé en utilisant une propriété spécifique de MyObjectR.
Comme il ressort de la ligne de code suivante (ce qui est acceptable pour la syntaxe VB.NET):
Dim v As MyObjectS() = New MyObjectS() {u.Select(Function(a) a.MyProperty)}
Ici, je voudrais utiliser une certaine façon l'itérateur pour alimenter l'utilisation successive du paramétrés Nouveau de MyObjectS pour créer un tableau d'entre eux. Bien sûr, la ligne de syntaxe ci-dessus n'est pas correcte.
(Pour ceux qui envisagent l'idée, je dois ajouter que je ne veux pas impliquer l'utilisation d'opérateurs d'élargissement ici, même si possible parce que MyObjectS pourrait très bien être un objet de classe que je ne contrôle pas. Par exemple, il peut s'agir d'un ListViewItem [qui a une New accepting String paramétrée.] Donc, ce n'est pas forcément un objet que je peux bricoler.)
La syntaxe n'est pas aussi simple que j'aimerais la voir dans VB.NET. Mais j'imagine que quelque part dans VB.NET la syntaxe existe et je suis tout simplement ignorant à ce sujet.
est ici une autre option J'ai aussi essayé sans succès (ou d'attendre le succès):
Dim v As MyObjectS() = New MyObjectS() {u.Select(Function(a) a.MyProperty).ToArray}
Juste pour être complet, je sais que je peux facilement le faire de cette façon:
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
Mais je voudrais apprendre toute nouvelle syntaxe qui peut effectuer une opération similaire sans avoir besoin de créer un List (Of T) pour le faire. Il y a de bonnes raisons de performance, si pas d'autre.
Est-ce que 'Dim v = u.Select (Fonction (a) a.MyProperty) .Cast (Of MyObjectS) .ToArray()' fonctionne? – Ryan