Una lista genérica de clases anónimas.

Resuelto DHornpout asked hace 15 años • 22 respuestas

En C# 3.0 puedes crear una clase anónima con la siguiente sintaxis

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

¿Hay alguna manera de agregar estas clases anónimas a una lista genérica?

Ejemplo:

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);

Otro ejemplo:

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

while (....)
{
    ....
    list.Add(new {Id = x, Name = y});
    ....
}
DHornpout avatar Mar 05 '09 05:03 DHornpout
Aceptado

Podrías hacerlo:

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

Hay muchas formas de desollar a este gato, pero básicamente todas usarán inferencia de tipos en alguna parte, lo que significa que debes llamar a un método genérico (posiblemente como un método de extensión). Otro ejemplo podría ser:

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

var list = CreateList(o, o1);

Ya entiendes la idea :)

Jon Skeet avatar Mar 04 '2009 22:03 Jon Skeet

Aquí está la respuesta.

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);
Dutt avatar Oct 30 '2009 09:10 Dutt

Hay muchas formas de hacer esto, pero algunas de las respuestas aquí crean una lista que contiene elementos basura, lo que requiere que borre la lista.

Si está buscando una lista vacía del tipo genérico, use Seleccionar contra una Lista de tuplas para crear la lista vacía. No se crearán instancias de ningún elemento.

Aquí está la frase para crear una lista vacía:

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

Luego puedes agregarle usando tu tipo genérico:

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

Como alternativa, puedes hacer algo como lo siguiente para crear la lista vacía (pero prefiero el primer ejemplo porque también puedes usarlo para una colección poblada de tuplas):

 var emptyList = new List<object>()
          .Select(t => new { Id = default(int), Name = default(string) }).ToList();   
Paul Rouleau avatar Nov 26 '2014 17:11 Paul Rouleau