Criar uma lista de tipo anônimo em VB
-
06-07-2019 - |
Pergunta
Eu gostaria de criar uma lista de um tipo anônimo, por exemplo:
Dim lineItem = New With {.Name = myFile(index).Last_Name & ", " & myFile(index).First_Name, _
.StartDate = myFile(index).Day,
.EndDate = myFile(index).Day}
Eu criei esse tipo anônimo. Agora eu gostaria de adicionar a uma lista desse tipo. Como faço para declarar uma lista desse tipo?
Solução
Aqui está um método útil para a criação de uma lista de um tipo anônimo de um único 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
Agora você pode apenas fazer o seguinte
Dim list = CreateListFromSingle(dsResource)
Editar OP queria uma maneira de criar a lista antes de criar um elemento.
Existem 2 maneiras de fazer isso. Você pode usar o seguinte código para criar uma lista vazia. Faz fronteira com hacky porque você está passando parâmetros você não tem intenção alguma de usar, mas ele 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 })
Outras dicas
Aqui está como fazê-lo em linha usando fundição por exemplo (sem a criação de uma segunda função):
Sub Main()
Dim x = New With {.Name = "Bob", .Number = 8675309}
Dim xList = {x}.ToList()
End Sub
(com base em c # versão postada aqui )
Essencialmente, você criar o tipo anônimo, colocá-lo em uma matriz ({x}), em seguida, usar o método da matriz .ToList () para obter uma lista.
Como cerca de um único constructo linha como esta?
Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList
Uma vez que o tipo é anônimo, você deve usar genérica e tipo de inferência.
A melhor maneira é a introdução de uma função genérica que cria uma coleção vazia de um objeto de protótipo.
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
Eu como solução de Jared, mas apenas para mostrar o equivalente direto do código de Jon (não obstante o meu comentário lá):
Public Function EnumerateFromSingle(Of T)(ByVal p1 As T) As IEnumerable(Of T)
Return New T() { p1 }
End Function
Não é muito útil por si só, uma vez que não é extensível ... mas pode ser usado para semear outras magias LINQ para criar listas maiores.
Em uma única linha que você pode adicionar tipos anônimos em uma lista ??p>
Dim aList = {(New With {.Name="John", .Age=30}), (New With {.Name="Julie", .Age=32})}.ToList
Se você está adicionando valores para a lista por iteração, eu suponho que você tem um IEnumerable
para começar? Basta usar .Select
com .ToList
. Isso é o que ele é projetado para.
Dim l = dsResources.Select(Function(d) New With {
.Name = d.Last_Name & ", " & d.First_Name
}).ToList()