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?

Foi útil?

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

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top