如何使用Lambda或Linq将匿名类型转换为基本类型成员

时间:2011-11-23 02:15:05

标签: c# linq lambda

您好我正在尝试使用Lambda Expression将匿名类型列表转换为基本类型列表,到目前为止我没有运气。

我知道我可以使用foreach循环播放' a'并获取值,但我想知道如何在Lambda或Linq中执行此操作。

var a = new []{ new {name= "jerry", age = 32}, new {name="peter",age=23}};

List<string> b = a.Select(p => new System.String{p.name}).ToList();
List<int> c = a.Select(p => new System.Int32{p.age}).ToList();

3 个答案:

答案 0 :(得分:2)

var a = new[] { new { name = "jerry", age = 32 },new {name = "peter", age = 23}};

List<string> b = a.Select(p => p.name).ToList();
List<int> c = a.Select(p => p.age).ToList();

答案 1 :(得分:2)

        var a = new[] { new { name = "jerry", age = 32 }, new { name = "peter", age = 23 } };

        List<string> b = a.Select(p => p.name).ToList();
        List<int> c = a.Select(p => p.age).ToList(); 

问题在于您在new System.String{p.name}中使用{和}。这不是实例化类型的有效方法。

答案 2 :(得分:2)

为什么要尝试通过调用构造函数来实例化一个新实例?

这样:

var a = new []{ new {name= "jerry", age = 32}, new {name="peter",age=23}}; 

List<string> b = a.Select(p => p.name}).ToList(); 
List<int> c = a.Select(p => p.age).ToList(); 

工作正常。 p.Age是一个整数,因此是一个值类型。这意味着它是按值复制的,因此您可以在列表中获得唯一的副本c。 p.name是一个字符串。在.NET中,字符串是不可变的,因此共享字符串实例完全可以保存。

另请注意,这两种结构都不存在! 另一个注意事项是,在调用构造函数时,您需要使用()而不是{}