在LINQ中,select new
关键字组合有什么作用?
我没有找到太多关于此的文档。
由于
答案 0 :(得分:23)
通过使用select new
,您可以使用您正在使用的集合中的数据或对象来创建新对象,无论是键入的anonymously还是正常的。
的 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
关键字,就像您习惯的那样 - 通过其构造函数之一构造一些已知类型的对象。
选择称为转换(或投影)运算符。它允许您通过转换函数将数据放入您正在使用的集合中,以在另一侧为您提供新对象。在上面的例子中,我们只是通过选择person对象的特定属性并用它们做某事来简单地将person对象“转换”为其他类型。因此select new ...
的组合实际上只是将new
操作指定为select
语句的转换函数。对于上述两个例子,这可能更有意义:
第3。使用不select
的{{1}},无需转化
当然,您不需要同时使用new
和select
。举个例子:
new
这将返回您正在使用的集合中的原始对象类型 - 没有转换,也没有新的对象创建。
的 4。使用不var someJohns = from person in people
where person.name == "John"
select person;
的{{1}}进行转化
最后,没有select
关键字的转换:
new
它会返回一些新类型的对象,它是从转换函数生成的,而不是直接使用new
关键字来构造它。
答案 1 :(得分:1)
select
关键字后跟new
表达式,可能会创建anonymous type。
换句话说,它是以下两个不相关表达式的组合:
select
from a in whatever select 2
new { Prop1 = 3, Prop2 = DateTime.Now }
答案 2 :(得分:1)
它不是真正的组合,new
只是创建一个匿名类型来返回值。否则你将不得不使用Dictionaries / Arrays等(比如PHP),这总是很难看。
var q =
from staff in theWhiteHouseStaff
select new { Name = staff.Name } ;