LINQ短构造函数作为操作

时间:2018-01-29 14:39:32

标签: c# linq

使用linq我可以像这样创建一个查询

XElement.Elements("...").Select(x=> useX(x));

现在因为x只创建一个包装器Action而useX的参数是XElement,你可以像这样使用它:

XElement.Elements("...").Select(useX);

但是当我的类型具有匹配类型的构造函数,即MyClass(XElement元素)时,我必须使用:

XElement.Elements("...").Select(x=> new MyClass(x));

我的问题:有没有办法以类似上面的方式缩短对象的构造但是使用构造函数?我想象过这样的事情:

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

3 个答案:

答案 0 :(得分:7)

  

有没有办法以上面的方式缩短对象的构造,但是使用构造函数

简短回答:不,没有。

更长"回答" (实际上并不是一个答案,如果你想要的话更多的解决方法):

您可以向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);

但它是否值得,取决于你! (个人观点:它不值得,只需坚持new MyClass(x)

答案 1 :(得分:3)

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

你被.Select(x=> new MyClass(x))困住了。当然,您可以改为调用工厂方法,但这更像是一种解决方法。

答案 2 :(得分:0)

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

Select(myMethod);

然而,如果存在重载,则无法执行此操作,因为您不清楚其中的哪一个。

对于构造函数,它有点不同。无法使用 method-group 引用它。 MyClass不是new MyClass()的有效方法组。

简而言之:you can´t reference a constructor using a method-group