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?

È stato utile?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top