Создание списка анонимного типа в VB
Я хотел бы создать список анонимного типа, например:
Dim lineItem = New With {.Name = myFile(index).Last_Name & ", " & myFile(index).First_Name, _
.StartDate = myFile(index).Day,
.EndDate = myFile(index).Day}
Я создал этот анонимный тип. Теперь я хотел бы добавить его в список этого типа. Как объявить список этого типа?
Ответы
Ответ 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()