18

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

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

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

4

7 回答 7

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)

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 })
于 2009-06-23T17:49:51.207 回答
12

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

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

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

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

于 2011-08-17T20:11:18.747 回答
9

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

Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList
于 2014-09-13T00:16:48.750 回答
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
于 2009-06-23T17:51:59.003 回答
2

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

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

本身不是很有用,因为它不可扩展……但可用于播种其他 LINQ 魔法以创建更大的列表。

于 2009-06-23T17:53:31.780 回答
2

在一行中,您可以将匿名类型添加到列表中

Dim aList = {(New With {.Name="John", .Age=30}), (New With {.Name="Julie", .Age=32})}.ToList
于 2017-07-17T16:14:36.983 回答
0

如果您通过迭代向列表添加值,我假设您有一个IEnumerable开始?只需.Select.ToList. 这就是它的设计目的。

Dim l = dsResources.Select(Function(d) New With {
                              .Name = d.Last_Name & ", " & d.First_Name
                          }).ToList()
于 2013-07-11T02:02:43.163 回答