何时需要在select子句中使用new,如下例所示?感谢。
var results = from person in people
select new { FN = person.FirstName, LN = person.LastName };
我已经搜索并部分理解了这一点:“在select new中,我们正在创建一个只包含您需要的属性的新匿名类型。”但这是否意味着我可以省略新的而不是匿名类型?
以另一种方式重述我的问题:'new'是否可选?这里的'new'类似于C#new,值类型不需要它吗?
我可以这样做吗?
var results = from person in people
select { FN = person.FirstName, LN = person.LastName };
答案 0 :(得分:1)
如果您要投射到 new 类型(匿名类或已知类/结构),则它不是可选的,而是必需的。
如果您要投射到现有的实例,当然您不需要new
,即在您的示例中,如果您只想投射到每个人的名字(要获得字符串枚举,您可以这样做:
var results = from person in people select person.FirstName
因此,如果您正在构建一个新类型,那么您需要在投影中使用新类型(Select
),如果您只是选择已经存在的新类型,那么您将不会这样做。
答案 1 :(得分:1)
您可以实例化以Person作为参数的命名类型的实例,或使用对象初始值设定语法指定值,而不是创建匿名类型。
示例:
var results = from person in people
select new Report(person);
var results = from person in people
select new Report() { Customer = person };
编辑:或者当然只是从人物对象中选择一个属性,正如BrokenGlass所指出的那样!
编辑:我只是重新阅读你的问题,并想指出C#中的匿名类型只是普通类型,编译器生成了类型名称。所以,是的,您仍然需要使用new运算符,因为您正在创建一个类型的新实例。 Anonymous Types (C# Programming Guide)
答案 2 :(得分:1)
不,如果您选择“新”对象,new
不是可选的。 (这就是你正在做的事情。你正在创建一个具有2个属性FN
和LN
的匿名类型的新对象。
简单地省略new
是语法错误。
如果您要使用现有类型,(例如,您已定义了class
Person
,其中包含2个属性FN
和LN
),那么您可以使用那种类型。 E.g。
var results = from person in people
select new Person { FN = person.FirstName, LN = person.LastName };
(假设Person有一个无参数构造函数,而FN
和LN
是带有setter的属性)
如果您没有创建新对象,则唯一可省略new
的时间是:
var results = from person in people
select LN = person.LastName;
您只选择LastName
,结果为IEnumerable<string>