在VB中创建匿名类型列表

19

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

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

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

7个回答

15
这里有一个方便的方法,可以从单个匿名类型创建匿名类型列表。
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)

编辑:原帖作者想要在创建元素之前创建列表的方法。

有两种方法可以做到这一点。您可以使用下面的代码创建一个空列表。这有点巧妙,因为您正在传递您永远不打算使用的参数,但它可以工作。

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

有没有办法在给匿名类型赋值之前对其进行原型设计?我想在迭代要添加到其中的内容之前创建该类型的列表。 - Daniel
1
是的,总有一种方法可以做到事情。但你不会喜欢它。因为它被称为反射。 - AgentFire
@JaredPar,你能告诉我哪里出了问题吗?我收到了错误提示 Type 'T' is not defined. 这是我尝试的截图 HERE - user153923

12

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

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

(基于此处发布的 C# 版本 链接)

你可以创建一个匿名类型,将其放入数组 ({x}) 中,然后使用该数组的 .ToList() 方法获取列表。


9
这种单行结构怎么样?它是这样的:
Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList

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

你忘记将原型元素添加到列表中了...;-) - Konrad Rudolph
1
我没有;-) 这应该用来创建一个新列表。原型对象只是为了提供关于其结构而不是内容的信息。 - Dario

2
在一行代码中,您可以将匿名类型添加到列表中。
Dim aList = {(New With {.Name="John", .Age=30}), (New With {.Name="Julie", .Age=32})}.ToList

2

我喜欢Jared的解决方案,但只是为了展示Jon代码的直接等效(尽管我在那里发表了评论):

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

单独使用并不是很有用,因为它本身不可扩展……但可以用来启动其他LINQ魔法,以创建更大的列表。


0
如果你是通过迭代将值添加到列表中,我假设你一开始有一个IEnumerable?只需使用.Select与.ToList即可。那就是它的设计目的。
Dim l = dsResources.Select(Function(d) New With {
                              .Name = d.Last_Name & ", " & d.First_Name
                          }).ToList()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接