2009-06-23 25 views
12

Tôi muốn tạo ra một danh sách của một loại vô danh, ví dụ:Tạo một danh sách các Anonymous Gõ vào VB

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

Tôi đã tạo ra kiểu nặc danh. Bây giờ tôi muốn thêm nó vào danh sách loại đó. Làm cách nào để khai báo danh sách loại đó?

Trả lời

12

Dưới đây là một phương pháp tiện dụng để tạo danh sách loại ẩn danh từ một loại ẩn danh duy nhất.

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 

Bây giờ bạn chỉ có thể làm như sau

Dim list = CreateListFromSingle(dsResource) 

EDIT OP muốn có một cách để tạo ra danh sách trước khi tạo ra một phần tử.

Có 2 cách để thực hiện việc này. Bạn có thể sử dụng đoạn mã sau để tạo một danh sách trống. Nó biên giới trên hacky bởi vì bạn đang đi qua các thông số bạn không bao giờ có ý định sử dụng nhưng nó hoạt động.

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

Có cách nào để chế tạo thử nghiệm các loại vô danh trước khi gán giá trị cho một đơn kiểu đó? Tôi muốn có một danh sách các loại được tạo ra trước khi tôi lặp qua các nội dung tôi muốn thêm vào nó. – Daniel

+1

Có, luôn có cách để làm mọi thứ. Nhưng bạn sẽ không thích nó. Bởi vì nó được gọi là sự phản chiếu. – AgentFire

+0

@JaredPar, bạn có thể cho tôi biết tôi đã làm gì sai không?Tôi nhận được lỗi ** Loại 'T' không được xác định. ** Ảnh chụp màn hình về cách tôi đã cố gắng thực hiện [HERE] (http://i.imgur.com/XjtN5HV.png). – jp2code

6

Vì loại này là ẩn danh, bạn phải sử dụng chung và kiểu suy luận.

Cách tốt nhất là giới thiệu một hàm chung tạo bộ sưu tập trống từ đối tượng mẫu thử nghiệm.

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 
+0

Bạn quên thêm phần tử nguyên mẫu vào danh sách… ;-) –

+1

Tôi không ;-) Điều này nên được sử dụng để tạo danh sách mới. Đối tượng nguyên mẫu chỉ cần cung cấp thông tin về cấu trúc của nó chứ không phải về nội dung của nó. – Dario

2

Tôi thích giải pháp Jared nhưng chỉ để hiển thị tương đương trực tiếp mã Jon (mặc dù nhận xét của tôi có):

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

Không rất hữu ích bởi chính nó, vì nó không thể mở rộng ... nhưng có thể được sử dụng để tạo ra các phép thuật LINQ khác để tạo các danh sách lớn hơn.

7

Sau đây là cách để làm điều đó inline sử dụng đúc bằng ví dụ (mà không cần tạo một chức năng thứ hai):

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

(dựa trên C# phiên bản posted here)

Về cơ bản bạn tạo kiểu nặc danh, đưa nó trong một mảng ({x}) sau đó sử dụng phương thức .ToList() của mảng để lấy danh sách.

0

Nếu bạn đang thêm giá trị vào danh sách bằng cách lặp lại, tôi giả sử bạn có một số IEnumerable để bắt đầu? Chỉ cần sử dụng .Select với .ToList. Đó là những gì nó được thiết kế cho.

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

Làm thế nào để xây dựng một dòng như thế này?

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

Trong một dòng duy nhất bạn có thể thêm các kiểu nặc danh vào một danh sách

Dim aList = {(New With {.Name="John", .Age=30}),(.Name="Julie", .Age=32)}.ToList 
Các vấn đề liên quan