我想创建一个匿名类型的列表,例如:
Dim lineItem = New With {.Name = myFile(index).Last_Name & ", " & myFile(index).First_Name, _
.StartDate = myFile(index).Day,
.EndDate = myFile(index).Day}
我创建了匿名类型。现在我想将它添加到该类型的列表中。如何声明该类型的列表?
答案 0 :(得分:14)
这是一种从单个匿名类型创建匿名类型列表的便捷方法。
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)
编辑 OP希望在创建元素之前创建列表。
有两种方法可以做到这一点。您可以使用以下代码创建一个空列表。它接近hacky,因为你传递的参数是你从未打算使用但它有效。
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 })
答案 1 :(得分:9)
以下是如何使用逐个示例进行内联(不创建第二个函数):
Sub Main()
Dim x = New With {.Name = "Bob", .Number = 8675309}
Dim xList = {x}.ToList()
End Sub
(基于c#版本发布here)
基本上,您创建匿名类型,将其放入数组({x}),然后使用数组的.ToList()方法获取列表。
答案 2 :(得分:8)
这样的单行构造怎么样?
Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList
答案 3 :(得分:6)
由于类型是匿名的,因此必须使用泛型和类型推断。
最好的方法是引入一个从原型对象创建空集合的泛型函数。
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
答案 4 :(得分:2)
我喜欢Jared的解决方案,但只是为了显示Jon的代码的直接等价物(尽管我在那里发表评论):
Public Function EnumerateFromSingle(Of T)(ByVal p1 As T) As IEnumerable(Of T)
Return New T() { p1 }
End Function
它本身不是很有用,因为它不可扩展......但可以用来为其他LINQ魔法播种以创建更大的列表。
答案 5 :(得分:1)
在一行中,您可以将匿名类型添加到列表中
Dim aList = {(New With {.Name="John", .Age=30}),(.Name="Julie", .Age=32)}.ToList
答案 6 :(得分:0)
如果您通过迭代向列表中添加值,我假设您开始使用IEnumerable
?只需将.Select
与.ToList
一起使用即可。这就是它的设计目标。
Dim l = dsResources.Select(Function(d) New With {
.Name = d.Last_Name & ", " & d.First_Name
}).ToList()