2009-06-23 83 views
12

名單,我想創建一個匿名類型的列表,例如:創建匿名類型在VB

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

我已經創建了一個匿名類型。現在我想將它添加到該類型的列表中。我如何聲明該類型的列表?

回答

12

這是一個方便的方法,用於從單個匿名類型創建匿名類型的列表。

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就想了一個辦法創造一個元素之前創建列表。

有2種方法可以做到這一點。您可以使用下面的代碼來創建一個空列表。它與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 }) 
+0

有什麼辦法來該類型的單指派值之前原型匿名類型?我希望在我迭代想要添加的內容之前創建該類型的列表。 – Daniel 2009-06-23 17:58:26

+1

是的,總有辦法做事。但你不會喜歡它。因爲它被稱爲反射。 – AgentFire 2013-07-11 03:37:52

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 
2

我喜歡Jared的解決方案,但只是爲了顯示的Jon的代碼直接等同(儘管我的評論有):

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

自身不非常有用的,因爲它是不可擴展......但也可使用爲其他LINQ魔術種子創建更大的列表。

7

下面是直列使用例如鑄造做到這一點(而無需創建第二個功能):

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

(基於C#版本發佈here

基本上你創建匿名類型,把它在一個數組({x})中,然後使用數組的.ToList()方法來獲取一個列表。

0

如果通過迭代將值添加到列表中,我假設您有一個IEnumerable開始?只需使用.Select.ToList即可。這就是它的設計目的。

Dim l = dsResources.Select(Function(d) New With { 
           .Name = d.Last_Name & ", " & d.First_Name 
          }).ToList() 
6

這樣的單線結構如何?

Dim yourList = {(New With {.Name="", .Age=0})}.Take(0).ToList 
1

在一個單一的線,你可以添加匿名類型到一個列表

Dim aList = {(New With {.Name="John", .Age=30}),(.Name="Julie", .Age=32)}.ToList