在VB中创建匿名类型列表

Dan*_*iel 15 .net linq vb.net list anonymous-types

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

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

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

Jar*_*Par 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
Run Code Online (Sandbox Code Playgroud)

现在您可以执行以下操作

Dim list = CreateListFromSingle(dsResource)
Run Code Online (Sandbox Code Playgroud)

EDIT 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 })
Run Code Online (Sandbox Code Playgroud)


Cle*_*man 9

以下是如何通过示例使用内联进行内联(不创建第二个函数):

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

(基于此处发布的c#版本)

基本上,您创建匿名类型,将其放入数组({x}),然后使用数组的.ToList()方法获取列表.


小智 8

像这样的单行结构怎么样?

Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList
Run Code Online (Sandbox Code Playgroud)


Dar*_*rio 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
Run Code Online (Sandbox Code Playgroud)