选择新的关键字组合

在LINQ中, select new关键字组合有什么作用?

我没有找到太多关于此的文档。

谢谢

通过使用select new ,您可以使用正在使用的集合中的数据或对象来创建新对象,无论是匿名还是正常键入。

1.使用select new返回新的匿名类型对象:

 var records = from person in people select new { person.name, person.id }; 

这使用new关键字创建一组匿名类型的对象。 编译器只创建一个新的对象类型,其中包含两个属性。 如果你在调试器中查看对象类型,你会发现它有一个看起来很疯狂的自动生成类型名称。 但你也可以使用new关键字就像你习惯于linq之外的那样:

2.使用select new构造“常规”类型的对象:

 var records = from person in people select new CreditRecord(person.creditLimit, person.name); 

这个例子就像你习惯的那样使用new关键字 – 通过它的一个构造函数构造一些已知类型的对象。

Select称为转换(或投影)运算符。 它允许您通过转换函数将数据放入您正在使用的集合中,以在另一侧为您提供新对象。 在上面的例子中,我们只是通过选择person对象的特定属性并用它们做某事来简单地将person对象“转换”为其他类型。 因此, select new ...的组合实际上只是将new操作指定为select语句的转换函数。 对于上述两个反例,这可能更有意义:

3.使用select without new ,没有转换

当然,您不需要一起使用selectnew 。 举个例子:

 var someJohns = from person in people where person.name == "John" select person; 

这将返回您正在使用的集合中的原始对象类型 – 没有转换,也没有新的对象创建。

4.使用select without new ,进行转换

最后,没有new关键字的转换:

 var personFoods = from person in people select person.GetFavoriteFoods(); 

它会返回一些新类型的对象,这些对象是从转换函数生成的,而不是直接使用new关键字来构造它。

它是select关键字,后跟一个new表达式,可能会创建一个匿名类型 。

换句话说,它是以下两个不相关表达式的组合:

select

 from a in whatever select 2 

匿名类型

 new { Prop1 = 3, Prop2 = DateTime.Now } 

它不是真正的组合, new只是创建一个匿名类型来返回值。 否则你将不得不使用Dictionaries / Arrays等(如在PHP中),这总是很难看。

 var q = from staff in theWhiteHouseStaff select new { Name = staff.Name } ;