Questa è una domanda vecchia, ma ho pensato di inserire la risposta C# 6. Spesso devo impostare i dati di test che sono facilmente inseriti in codice come elenco di tuple. Con un paio di funzioni di estensione, è possibile avere questo formato piacevole e compatto, senza ripetere i nomi su ciascuna voce.
var people= new List<Tuple<int, int, string>>() {
{1, 11, "Adam"},
{2, 22, "Bill"},
{3, 33, "Carol"}
}.Select(t => new { Id = t.Item1, Age = t.Item2, Name = t.Item3 });
Questo dà un IEnumerable - se si desidera un elenco che è possibile aggiungere a quel momento basta aggiungere ToList().
La magia viene dall'estensione personalizzata Aggiungi metodi per le tuple, come descritto a https://stackoverflow.com/a/27455822/4536527.
public static class TupleListExtensions {
public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
T1 item1, T2 item2) {
list.Add(Tuple.Create(item1, item2));
}
public static void Add<T1, T2, T3>(this IList<Tuple<T1, T2, T3>> list,
T1 item1, T2 item2, T3 item3) {
list.Add(Tuple.Create(item1, item2, item3));
}
// and so on...
}
L'unica cosa che non mi piace è che i tipi sono separati dai nomi, ma se davvero non si vuole fare una nuova classe, allora questo approccio sarà ancora permetterà di avere dati leggibili
Si noti che tutti gli oggetti devono essere digitati nello stesso array. Raramente potresti aver bisogno di aiuto con un cast, specialmente per null 'new [] {new {Id = (int?) Null, Name =" Foo "}, new {Id = (int?) 1, Name =" Foo " }} ' – AaronLS
I tipi anonimi sono progettati per essere utilizzati come memoria temporanea, nella maggior parte dei casi li creeresti in LINQ select statement usando Select (i => new {i.ID, i.Name}); che restituirebbe un IEnumerable del tipo corretto se ridefinisci la tua clausola while in una LINQ.Quando non dovresti mai aver bisogno dell'elenco e se lo hai fatto puoi semplicemente chiamare ToList su di esso – MikeT