Una lista genérica de clases anónimas.
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});
....
}
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 :)
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);
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();