选择新的关键字组合
在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
,没有转换
当然,您不需要一起使用select
和new
。 举个例子:
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 } ;