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
C# LINQ短构造函数作为动作_C#_Linq - Fatal编程技术网

C# LINQ短构造函数作为动作

C# LINQ短构造函数作为动作,c#,linq,C#,Linq,使用linq,我可以创建如下查询 XElement.Elements("...").Select(x=> useX(x)); 现在,由于x只创建一个包装器动作,而useX的参数是XElement,所以您也可以像这样使用它: XElement.Elements("...").Select(useX); 但是,当我有一个具有匹配类型的构造函数的类型时,即MyClass(XElement元素),我必须使用: XElement.Elements("...").Select(x=> new

使用linq,我可以创建如下查询

XElement.Elements("...").Select(x=> useX(x));
现在,由于x只创建一个包装器动作,而useX的参数是XElement,所以您也可以像这样使用它:

XElement.Elements("...").Select(useX);
但是,当我有一个具有匹配类型的构造函数的类型时,即MyClass(XElement元素),我必须使用:

XElement.Elements("...").Select(x=> new MyClass(x));
我的问题是:有没有办法像上面那样用构造函数来缩短对象的构造?我想象的是这样的:

XElement.Elements("...").Select(MyClass);
Select(myMethod);

不,不能在lambda表达式中缩短对构造函数的调用。问题是,使用new
new
运算符从操作调用构造函数

你被
卡住了。选择(x=>newmyclass(x))
。当然,您可以使用工厂方法来代替调用,但这更像是一种变通方法

有没有办法像上面那样用构造函数来缩短对象的构造

简短回答:没有

“答案”越长(实际上不是答案,如果您愿意,解决方法越多):

您可以将静态构造方法添加到
MyClass

public class MyClass
{
   public MyClass(XElement elem) 
   {
       // your constructor logic
   }

   public static MyClass Create(XElement elem)
   {
      return new MyClass(elem);
   }
}
用这个

XElement.Elements("...").Select(MyClass.Create);

但是否值得,这取决于你!(个人观点:这不值得,只要坚持使用
newmyclass(x)

实际上,如果可以从用法中清楚地推断出实际要使用的委托,那么只接受方法组的语法是有效的。例如,一个返回int并期望得到int的方法,如果没有进一步的重载,也可以这样使用:

XElement.Elements("...").Select(MyClass);
Select(myMethod);
然而,如果有重载,你不能这样做,因为不清楚你指的是哪一个

对于构造器来说,这有点不同。无法使用方法组引用它
MyClass
不是
new MyClass()
的有效方法组


简而言之:.

您的类可能有不同的重载构造函数,并且
x
作为lambda参数的存在不足以让编译器推断要使用哪个构造函数:例如,您可能希望使用
MyClass
中的默认构造函数,不管是否有
x
。一个方法也可以有多个重载,因此不是真正的参数@Tigran@PatrickHofman:不确定多个重载方法与所有这些有什么关系。我的观点是,在这个场景中,您必须指定要使用的具体的ctor,即使编译器在某种程度上能够自行决定使用哪个ctor。您必须明确。但是
.Select(useX)
如何知道调用哪个方法呢?这只是一个方法分辨率的问题,构造器可以采用相同的方法@TigranThis并不是的完全重复,但at的答案解释了为什么答案是“否”。这是一个解决方法,这不是问题的答案。@PatrickHofman一切都是为了解决计算机不会说英语的问题:)我不能这么说。这回答了问题,不管有人怎么描述。我实际上同意@PatrickHofman,所以我适当地更新了我的答案。