关于c#:匿名类的通用列表

A generic list of anonymous class

在C 3.0中,可以使用以下语法创建匿名类

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

有没有办法将这些匿名类添加到通用列表中?

例子:

1
2
3
4
5
6
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);

另一个例子:

1
2
3
4
5
6
7
8
List<var> list = new List<var>();

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


你可以这样做:

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

有很多种方法可以剥皮这只猫,但基本上它们都会在某个地方使用类型推断——这意味着您必须调用一个泛型方法(可能是一个扩展方法)。另一个例子可能是:

1
2
3
4
5
6
public static List<T> CreateList<T>(params T[] elements)
{
     return new List<T>(elements);
}

var list = CreateList(o, o1);

你明白了:)


这是答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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}
"
, item.Name, item.Number);
}

MessageBox.Show(result);


有很多方法可以做到这一点,但是这里的一些响应正在创建一个包含垃圾元素的列表,这需要您清除该列表。

如果要查找泛型类型的空列表,请对元组列表使用select来生成空列表。不会实例化任何元素。

下面是创建空列表的一行程序:

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

然后可以使用泛型类型添加到其中:

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

另一种方法是,您可以执行如下操作来创建空列表(但是,我更喜欢第一个示例,因为您也可以将其用于填充的元组集合):

1
2
 var emptyList = new List<object>()
          .Select(t => new { Id = default(int), Name = default(string) }).ToList();