Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ:什么时候在Select子句中使用“new”?_Linq_Select_New Operator - Fatal编程技术网

LINQ:什么时候在Select子句中使用“new”?

LINQ:什么时候在Select子句中使用“new”?,linq,select,new-operator,Linq,Select,New Operator,在以下示例中,何时需要在select子句中使用new?谢谢 var results = from person in people select new { FN = person.FirstName, LN = person.LastName }; 我已经搜索并部分理解了这一点:在SelectNew中,我们正在创建一个新的匿名类型,其中只包含您需要的属性。但这是否意味着我可以省略new而不获取匿名类型 用另一种方式重申我的问题:“新”是可选的吗?这里的“new”与

在以下示例中,何时需要在select子句中使用new?谢谢

var results = from person in people
              select new { FN = person.FirstName, LN = person.LastName };
我已经搜索并部分理解了这一点:在SelectNew中,我们正在创建一个新的匿名类型,其中只包含您需要的属性。但这是否意味着我可以省略new而不获取匿名类型

用另一种方式重申我的问题:“新”是可选的吗?这里的“new”与C new类似吗?在C new中,值类型不需要它

我能做这个吗

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

如果要投影到新类型的匿名类或已知类/结构,则它不是可选的,而是必需的

如果您正在投影到现有实例,当然不需要新实例,即在您的示例中,如果您只想投影到每个人的名字以获得字符串枚举,您可以执行以下操作:

var results = from person in people select person.FirstName

因此,经验法则如果您正在构造一个新类型,您需要在“投影”中选择“新建”,如果您只是选择了一些已经存在但不存在的内容。

如果您正在投影到一个新类型匿名类或已知类/结构,则它不是可选的,而是必需的

如果您正在投影到现有实例,当然不需要新实例,即在您的示例中,如果您只想投影到每个人的名字以获得字符串枚举,您可以执行以下操作:

var results = from person in people select person.FirstName

因此,经验法则如果您正在构建一个新类型,您需要在投影中选择new,如果您只是选择了一些已经存在的类型,您不需要创建匿名类型。您可以实例化一个命名类型的实例,该实例将Person作为参数,或者使用对象初始值设定项语法赋值

例如:

var results = from person in people
              select new Report(person);

var results = from person in people
              select new Report() { Customer = person };
编辑:当然也可以像BrokenGlass指出的那样,从person对象中选择一个属性


编辑:我刚刚重读了你的问题,想指出C中的匿名类型只是具有编译器生成的类型名的普通类型。因此,是的,您仍然需要使用new操作符,因为您正在创建一个类型的新实例

您可以实例化以Person作为参数的命名类型的实例,或使用对象初始值设定项语法赋值,而不是创建匿名类型

例如:

var results = from person in people
              select new Report(person);

var results = from person in people
              select new Report() { Customer = person };
编辑:当然也可以像BrokenGlass指出的那样,从person对象中选择一个属性

编辑:我刚刚重读了你的问题,想指出C中的匿名类型只是具有编译器生成的类型名的普通类型。因此,是的,您仍然需要使用new操作符,因为您正在创建一个类型的新实例

否,如果选择新对象,则“新建”不是可选的。这就是你正在做的。您正在创建具有2个属性FN和LN的匿名类型的新对象

简单地省略new是一个语法错误

如果您有一个想要使用的现有类型,假设您已经定义了一个具有两个属性FN和LN的类Person,那么您可以使用该类型。例如

var results = from person in people
              select new Person { FN = person.FirstName, LN = person.LastName };
假设Person有一个无参数构造函数,FN和LN是带有setter的属性

只有在不创建新对象的情况下,才可以忽略“新建”,例如:

var results = from person in people
              select LN = person.LastName;
在这里,您只选择姓氏,结果是IEnumerable

否,如果您选择新对象,则“新建”不是可选的。这就是你正在做的。您正在创建具有2个属性FN和LN的匿名类型的新对象

简单地省略new是一个语法错误

如果您有一个想要使用的现有类型,假设您已经定义了一个具有两个属性FN和LN的类Person,那么您可以使用该类型。例如

var results = from person in people
              select new Person { FN = person.FirstName, LN = person.LastName };
假设Person有一个无参数构造函数,FN和LN是带有setter的属性

只有在不创建新对象的情况下,才可以忽略“新建”,例如:

var results = from person in people
              select LN = person.LastName;
在这里,您只选择姓氏,结果是IEnumerable