Общий список анонимного класса - PullRequest
380 голосов
/ 05 марта 2009

В C # 3.0 вы можете создать анонимный класс со следующим синтаксисом

var o = new { Id = 1, Name = "Foo" };

Есть ли способ добавить эти анонимные классы в общий список?

Пример:

var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };

List<var> list = new List<var>();
list.Add(o);
list.Add(o1);

Другой пример:

List<var> list = new List<var>();

while (....)
{
    ....
    list.Add(new {Id = x, Name = y});
    ....
}

Ответы [ 20 ]

398 голосов
/ 05 марта 2009

Вы можете сделать:

var list = new[] { o, o1 }.ToList();

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

public static List<T> CreateList<T>(params T[] elements)
{
     return new List<T>(elements);
}

var list = CreateList(o, o1);

Вы поняли:)

96 голосов
/ 30 октября 2009

Вот ответ.

string result = String.Empty;

var list = new[]
{ 
    new { Number = 10, Name = "Smith" },
    new { Number = 10, Name = "John" } 
}.ToList();

foreach (var item in list)
{
    result += String.Format("Name={0}, Number={1}\n", item.Name, item.Number);
}

MessageBox.Show(result);
48 голосов
/ 26 ноября 2014

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

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

Вот одна строка для создания пустого списка:

 var emptyList = new List<Tuple<int, string>>()
          .Select(t => new { Id = t.Item1, Name = t.Item2 }).ToList();

Затем вы можете добавить к нему свой общий тип:

 emptyList.Add(new { Id = 1, Name = "foo" });
 emptyList.Add(new { Id = 2, Name = "bar" });

В качестве альтернативы вы можете сделать что-то подобное ниже, чтобы создать пустой список (но я предпочитаю первый пример, потому что вы можете использовать его и для заполненной коллекции Tuples):

 var emptyList = new List<object>()
          .Select(t => new { Id = default(int), Name = default(string) }).ToList();   
43 голосов
/ 05 марта 2009

Не совсем, но вы можете сказать List<object>, и все будет работать. Однако list[0].Id не будет работать.

Это будет работать во время выполнения в C # 4.0 с List<dynamic>, то есть вы не получите IntelliSense.

23 голосов
/ 05 марта 2009

Я думаю

List<T> CreateEmptyGenericList<T>(T example) {
    return new List<T>();
}

void something() {
    var o = new { Id = 1, Name = "foo" };
    var emptyListOfAnonymousType = CreateEmptyGenericList(o);
}

будет работать.

Вы также можете написать это так:

void something() {
    var String = string.Emtpy;
    var Integer = int.MinValue;
    var emptyListOfAnonymousType = CreateEmptyGenericList(new { Id = Integer, Name = String });
}
19 голосов
/ 16 мая 2014

Я обычно использую следующее; главным образом потому, что вы «начинаете» со пустого списка.

var list = Enumerable.Range(0, 0).Select(e => new { ID = 1, Name = ""}).ToList();
list.Add(new {ID = 753159, Name = "Lamont Cranston"} );
//etc.

В последнее время я пишу это так:

var list = Enumerable.Repeat(new { ID = 1, Name = "" }, 0).ToList();
list.Add(new {ID = 753159, Name = "Lamont Cranston"} );

Использование метода повтора также позволит вам:

var myObj = new { ID = 1, Name = "John" };
var list = Enumerable.Repeat(myObj, 1).ToList();
list.Add(new { ID = 2, Name = "Liana" });

.. который дает вам начальный список с первым добавленным элементом.

19 голосов
/ 13 декабря 2012

Вы можете сделать это в своем коде.

var list = new[] { new { Id = 1, Name = "Foo" } }.ToList();
list.Add(new { Id = 2, Name = "Bar" });
10 голосов
/ 15 декабря 2015

Я проверил IL на несколько ответов. Этот код эффективно предоставляет пустой список:

    using System.Linq;
    …
    var list = new[]{new{Id = default(int), Name = default(string)}}.Skip(1).ToList();
9 голосов
/ 31 мая 2017

В последней версии 4.0, можно использовать динамический, как показано ниже

var list = new List<dynamic>();
        list.Add(new {
            Name = "Damith"
    });
        foreach(var item in list){
            Console.WriteLine(item.Name);
        }
    }
7 голосов
/ 07 июля 2011

Вот моя попытка.

List<object> list = new List<object> { new { Id = 10, Name = "Testing1" }, new {Id =2, Name ="Testing2" }}; 

Я придумал это, когда написал нечто подобное для создания анонимного списка для пользовательского типа.

...