2009-06-23 32 views
12

Me gustaría crear una lista de un tipo anónimo, por ejemplo:Crear una lista de Anonymous en VB Tipo

Dim lineItem = New With {.Name = myFile(index).Last_Name & ", " & myFile(index).First_Name, _ 
         .StartDate = myFile(index).Day, 
         .EndDate = myFile(index).Day} 

He creado ese tipo anónimo. Ahora me gustaría agregarlo a una lista de ese tipo. ¿Cómo declaro una lista de ese tipo?

Respuesta

12

Este es un método útil para crear una lista de un tipo anónimo de un solo tipo anónimo.

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 

Ahora usted puede simplemente hacer lo siguiente

Dim list = CreateListFromSingle(dsResource) 

EDITAR OP quería una forma de crear la lista antes de crear un elemento.

Hay 2 formas de hacerlo. Puede usar el siguiente código para crear una lista vacía. Limita con Hacky porque está pasando parámetros que no tiene la intención de usar pero funciona.

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 }) 
+0

¿Hay alguna manera crear un prototipo del tipo anónimo antes de asignar valores a una sola de ese tipo? Me gustaría tener una lista de ese tipo creada antes de recorrer los contenidos que deseo agregar. – Daniel

+1

Sí, siempre hay una manera de hacer las cosas. Pero no te gustará. Porque se llama el reflejo. – AgentFire

+0

@JaredPar, ¿podría decirme qué he hecho mal?Me sale el error ** El tipo 'T' no está definido. ** Captura de pantalla de cómo intenté hacerlo [AQUÍ] (http://i.imgur.com/XjtN5HV.png). – jp2code

6

Como el tipo es anónimo, debe utilizar la inferencia genérica y de tipo.

La mejor manera es introducir una función genérica que crea una colección vacía de un objeto 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 
+0

Olvidó agregar el elemento prototipo a la lista ... ;-) –

+1

No lo hice ;-) Esto debería usarse para crear una nueva lista. El objeto prototipo solo se requiere para proporcionar información sobre su estructura en lugar de sobre su contenido. – Dario

2

me gusta la solución de Jared, pero sólo para mostrar el equivalente directo del código de Jon (a pesar de mi comentario allí):

Public Function EnumerateFromSingle(Of T)(ByVal p1 As T) As IEnumerable(Of T) 
    Return New T() { p1 } 
End Function 
No

muy útil por sí mismo, ya que no es extensible ... pero que puede utilizarse para generar otras magia LINQ para crear listas más grandes.

7

Aquí es cómo hacerlo en línea usando la fundición por ejemplo (sin crear una segunda función):

Sub Main() 
    Dim x = New With {.Name = "Bob", .Number = 8675309} 
    Dim xList = {x}.ToList() 
End Sub 

(basado en C# versión publicada here)

Esencialmente se crea el tipo anónimo, puso en una matriz ({x}) y luego use el método .ToList() de la matriz para obtener una lista.

0

Si está agregando valores a la lista por iteración, supongo que tiene un IEnumerable para empezar? Simplemente use .Select con .ToList. Para eso está diseñado.

Dim l = dsResources.Select(Function(d) New With { 
           .Name = d.Last_Name & ", " & d.First_Name 
          }).ToList() 
6

¿Qué tal una sola línea de construcción como esta?

Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList 
1

En una sola línea puede agregar tipos anónimos en una lista

Dim aList = {(New With {.Name="John", .Age=30}),(.Name="Julie", .Age=32)}.ToList