选择新T()和在LINQ

时间:2015-12-30 22:09:07

标签: c# linq datatable

我今天一直在用LINQ和DataTable进行实验。

var query = from row1 in table1.AsEnumerable()
            from row2 in table2.AsEnumerable()
            where
            (row1.Field<string>("a") == row2.Field<string>("b"))

            select new Foo
               {
                   Property1 = row1.Field<string>("Hey")
                   Property2 = row2.Field<string>("Ho")
               };

并得出一个奇怪的结论,无论我select new Foo还是select new Foo(),查询的工作方式都完全相同。我真的希望与代表等进一步深入了解linq机制,以便清楚地理解这一点 - 但就目前而言,对于一个简单的人 - 是否存在差异,如果是这样,那会是什么?

修改 这个问题在SOF上已经有了类似的答案,但是&#34;对象初始化器&#34;并不是最重要的。它也非常具体地针对LINQ,其中90%的网络提示操作匿名类型(不知道为什么,我发现使用具体类型的一些好处,特别是Intellisense)。如果任何材料确实在LINQ中指定具体类型实现示例,我只能找到没有括号的new Foo。使用LINQ构建尤其适合初学者,可能很难找到在那里初始化的内容(对象,委托,谓词等 - 至少对我来说是这样)所以希望至少有些人会发现问题和响应很有用。

2 个答案:

答案 0 :(得分:10)

这两个表达式在C#

完全相同
SELECT Q.question_id, COUNT(QA.question_id) as questions_cnt
FROM Questions AS Q
    LEFT JOIN Questions_answers AS QA ON Q.question_id = QA.question_id
GROUP BY Q.question_id

new Foo
{
    Property1 = row1.Field<string>("Hey")
    Property2 = row2.Field<string>("Ho")
};

because Jon said soMr. Lippert tells us why C#众神选择在C#3.0中实现这一目标

在您的大型示例中,new Foo() { Property1 = row1.Field<string>("Hey") Property2 = row2.Field<string>("Ho") }; 采用此表单的表达式,并且由于对象初始值设定项表达式相同,因此较大的表达式也会产生相同的结果:)

答案 1 :(得分:6)

如果使用object initializer并且未将任何参数传递给构造函数,则可以省略括号。这两个陈述都是等价的。

来自C# language specification

  

对象创建表达式可以省略构造函数参数列表并括起括号,前提是它包含对象初始值设定项或集合初始值设定项。省略构造函数参数列表并括起括号等同于指定空参数列表。