2017-09-05 4 views
1

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.

+0

Est-ce que 'Dim v = u.Select (Fonction (a) a.MyProperty) .Cast (Of MyObjectS) .ToArray()' fonctionne? – Ryan

Répondre

1

Vous avez juste besoin d'une ligne de code

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

Vous demandez simplement le Sélectionnez iterator pour construire une nouvelle MyObjects pour chaque élément de la séquence d'entrée en utilisant la MyObjectR.MyProperty comme paramètre à MyObjects constructeur. À la fin, vous pouvez matérialiser la séquence résultante avec ToArray.

+0

Merci! Je me sens tellement stupide !! ;) – jonk