2010-02-14 57 views

回答

22

使用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关键字就像你习惯的那样 - 通过它的一个构造函数构造一些已知类型的对象。

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


3.使用select没有new,没有改造

当然你不需要使用selectnew在一起。就拿这个例子:

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

这让你回到那是在你一起工作的一整套原始对象类型 - 不转型,并没有创建新对象。


4。使用select没有new,具有改造

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

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

,让你回来了一些新类型的对象,从变换函数生成的,而不是通过直接使用new关键字来构造它。

1

这是select关键字后跟new表达式,可能会创建一个anonymous type

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

select

from a in whatever select 2 

Anonymous types

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

它不是一个真正的组合,new只是创建一个匿名类型返回值。否则,你将不得不使用字典/数组等(如在PHP中),这总是丑陋的。

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