Подтвердить что ты не робот

Создание списка анонимного типа в VB

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

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

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

4b9b3361

Ответ 1

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

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 хотел создать список перед созданием элемента.

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

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

Ответ 2

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

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

(на основе версии С#, размещенной здесь)

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

Мне нравится решение Jared, но для того, чтобы показать прямой эквивалент кода Jon (несмотря на мой комментарий):

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

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

Ответ 6

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

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

Ответ 7

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

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