这是一个老问题,但我想我会把我的C#6答案。我经常需要设置测试数据,这些数据很容易作为元组列表输入到代码中。借助一些扩展功能,可以使用这种精巧紧凑的格式,而不必在每个条目上重复名称。
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 });
这给出了一个IEnumerable - 如果你想要一个列表,你可以添加到然后只是添加ToList()。
魔法来自自定义扩展为元组添加方法,如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...
}
我不喜欢的唯一的事情是,类型从名字分开了,但如果你真的不想做一个新的类,那么这种做法将仍然让你有可读的数据。
请注意,所有对象必须在数组中输入相同。很少你可能需要帮忙演员,尤其是对于nulls new [] {new {Id =(int?)null,Name =“Foo”},new {Id =(int?)1,Name =“Foo” }}` – AaronLS 2013-05-24 19:25:11
匿名类型被设计为用作临时存储,在大多数情况下,您可以使用Select(i => new {i.ID,i.Name})在LINQ select语句中创建它们;如果您将while子句重新定义为LINQ.Where语句,您将不需要该列表,并且如果您确实可以直接调用ToList,则它将返回正确类型的IEnumerable。 – MikeT 2014-11-27 11:00:54