在VB中创建匿名类型列表

时间:2009-06-23 17:47:14

标签: .net vb.net linq list anonymous-types

我想创建一个匿名类型的列表,例如:

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

我创建了匿名类型。现在我想将它添加到该类型的列表中。如何声明该类型的列表?

7 个答案:

答案 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()