2009-06-23 3 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) 

EDIT OP хотел способ создания списка до создания элемента.

Есть 2 способа сделать это. Вы можете использовать следующий код для создания пустого списка. Он граничит с хаки, потому что вы передаете параметры, которые вы никогда не собираетесь использовать, но он работает.

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

+1

Да, всегда есть способ сделать что-то. Но вам это не понравится. Потому что это называется отражением. – AgentFire

+0

@ JaredPar, не могли бы вы рассказать мне, что я сделал неправильно?Я получаю ошибку ** Тип 'T' не определен. ** Снимок экрана о том, как я пытался это сделать [ЗДЕСЬ] (http://i.imgur.com/XjtN5HV.png). – jp2code

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

Вы забыли добавить элемент прототипа в список ... ;-) –

+1

Я этого не сделал ;-) Это нужно использовать для создания нового списка. Объект-прототип просто необходим, чтобы предоставить информацию о его структуре, а не о его содержании. – Dario

2

Мне нравится решение Джареда, но только, чтобы показать прямой эквивалент кода Джона (несмотря мой комментарий там):

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 
Смежные вопросы