Creazione di un elenco di tipo anonimo in VB
-
06-07-2019 - |
Domanda
Vorrei creare un elenco di un tipo anonimo, ad esempio:
Dim lineItem = New With {.Name = myFile(index).Last_Name & ", " & myFile(index).First_Name, _
.StartDate = myFile(index).Day,
.EndDate = myFile(index).Day}
Ho creato quel tipo anonimo. Ora vorrei aggiungerlo a un elenco di quel tipo. Come posso dichiarare un elenco di quel tipo?
Soluzione
Ecco un metodo utile per creare un elenco di un tipo anonimo da un singolo tipo anonimo.
Public Function CreateListFromSingle(Of T)(ByVal p1 As T) As List(Of T)
Dim list As New List(Of T)
list.Add(p1)
return List
End Function
Ora puoi semplicemente fare quanto segue
Dim list = CreateListFromSingle(dsResource)
EDIT OP voleva un modo per creare l'elenco prima di creare un elemento.
Ci sono 2 modi per farlo. È possibile utilizzare il seguente codice per creare un elenco vuoto. Confina con hacky perché stai passando parametri che non hai mai intenzione di usare ma funziona.
Public Function CreateEmptyList(Of T)(ByVal unused As T) As List(Of T)
Return New List(Of T)()
End Function
Dim x = CreateEmptyList(New With { .Name = String.Empty, .ID = 42 })
Altri suggerimenti
Ecco come farlo in linea usando il casting per esempio (senza creare una seconda funzione):
Sub Main()
Dim x = New With {.Name = "Bob", .Number = 8675309}
Dim xList = {x}.ToList()
End Sub
(basato sulla versione c # pubblicata qui )
Essenzialmente si crea il tipo anonimo, lo si inserisce in un array ({x}), quindi si utilizza il metodo .ToList () dell'array per ottenere un elenco.
Che ne dici di un costrutto a linea singola come questo?
Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList
Poiché il tipo è anonimo, è necessario utilizzare l'inferenza generica e di tipo.
Il modo migliore è introdurre una funzione generica che crea una raccolta vuota da un oggetto prototipo.
Module Module1
Sub Main()
Dim dsResource = New With {.Name = "Foo"}
Dim List = dsResource.CreateTypedList
End Sub
<System.Runtime.CompilerServices.Extension()> _
Function CreateTypedList(Of T)(ByVal Prototype As T) As List(Of T)
Return New List(Of T)()
End Function
End Module
Mi piace la soluzione di Jared ma solo per mostrare l'equivalente diretto del codice di Jon (nonostante il mio commento lì):
Public Function EnumerateFromSingle(Of T)(ByVal p1 As T) As IEnumerable(Of T)
Return New T() { p1 }
End Function
Non molto utile da solo, poiché non è estensibile & # 8230; ma può essere usato per seminare altra magia LINQ per creare elenchi più grandi.
In una sola riga puoi aggiungere tipi anonimi in un elenco
Dim aList = {(New With {.Name="John", .Age=30}), (New With {.Name="Julie", .Age=32})}.ToList
Se stai aggiungendo valori all'elenco per iterazione, suppongo che tu abbia un IEnumerable
per cominciare? Usa .Seleziona
con .ToList
. È per questo che è progettato.
Dim l = dsResources.Select(Function(d) New With {
.Name = d.Last_Name & ", " & d.First_Name
}).ToList()