LINQ:何时在Select子句中使用'new'?

时间:2011-12-05 04:27:48

标签: linq select new-operator

何时需要在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 };

3 个答案:

答案 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个属性FNLN的匿名类型的新对象。

简单地省略new是语法错误。

如果您要使用现有类型,(例如,您已定义了class Person,其中包含2个属性FNLN),那么您可以使用那种类型。 E.g。

var results = from person in people
              select new Person { FN = person.FirstName, LN = person.LastName };

(假设Person有一个无参数构造函数,而FNLN是带有setter的属性)

如果您没有创建新对象,则唯一可省略new的时间是:

var results = from person in people
              select LN = person.LastName;

您只选择LastName,结果为IEnumerable<string>