Создание списка анонимного типа в VB - PullRequest
15 голосов
/ 23 июня 2009

Я хотел бы создать список анонимного типа, например:

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

Я создал этот анонимный тип. Теперь я хотел бы добавить его в список этого типа. Как мне объявить список этого типа?

Ответы [ 7 ]

14 голосов
/ 23 июня 2009

Вот удобный метод для создания списка анонимного типа из одного анонимного типа.

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

Теперь вы можете просто сделать следующее

Dim list = CreateListFromSingle(dsResource)

EDIT OP хотел создать список до создания элемента.

Есть 2 способа сделать это. Вы можете использовать следующий код для создания пустого списка. Он граничит с хаки, потому что вы передаете параметры, которые вы никогда не собираетесь использовать, но это работает.

  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 })
9 голосов
/ 18 августа 2011

Вот как это сделать, используя пример приведения (без создания второй функции):

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

(на основе опубликованной версии c # здесь )

По сути, вы создаете анонимный тип, помещаете его в массив ({x}), а затем используете метод массива .ToList () для получения списка.

8 голосов
/ 13 сентября 2014

Как насчет однолинейной конструкции, подобной этой?

Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList
6 голосов
/ 23 июня 2009

Поскольку тип анонимный, вы должны использовать generic и type-inference.

Лучший способ - ввести универсальную функцию, которая создает пустую коллекцию из объекта-прототипа.

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
2 голосов
/ 23 июня 2009

Мне нравится решение Джареда, но я просто показываю прямой эквивалент кода Джона (несмотря на мой комментарий):

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

Сам по себе не очень полезен, так как он не расширяемый ... но может использоваться для создания другой магии LINQ для создания больших списков.

1 голос
/ 17 июля 2017

В одну строку вы можете добавить анонимные типы в список

Dim aList = {(New With {.Name="John", .Age=30}), (New With {.Name="Julie", .Age=32})}.ToList
0 голосов
/ 11 июля 2013

Если вы добавляете значения в список путем итерации, я предполагаю, что у вас есть IEnumerable для начала? Просто используйте .Select с .ToList. Вот для чего он предназначен.

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