C#LINQ to Method语法

时间:2014-08-21 12:48:47

标签: c# linq collections lambda

我试图在C#中围绕LINQ语句,我试图将简单查询转换为等效的方法语法。

我见过的大多数例子都混杂着其他陈述和条件,并使用更复杂的类型。现在,我希望尽可能简化这一点。 任何提示将不胜感激。

// create a list of numbers
List<int> data1 = new List<int>() { 1, 2, 3, 4 };

// create a list of numbers
List<int> data2 = new List<int>() { 5, 6, 7, 8 };  

var query = from n1 in data1
            from n2 in data2
            select n1 * n2;

有了这个,我得到16个数字,我可以使用foreach循环迭代。 我想知道如何使用方法语法做同样的事情。

感谢。

2 个答案:

答案 0 :(得分:10)

完整的详细信息在C#语言规范的第7.16节中。另外,我有an article in my Edulinq blog series你可能会觉得更容易阅读。

但是,对于您的特定情况......次要from来电最终会被转换为SelectMany来电,因此您可以启动,将其视为:< / p>

var query = data1.SelectMany(n1 => data2, (n1, n2) => new { n1, n2 })
                 .Select(pair => pair.n1 * pair.n2);

但实际上编译器会崩溃这两个,因为你只是select之后得到from子句:

var query = data1.SelectMany(n1 => data2, (n1, n2) => n1 * n2);

对于查询表达式及其扩展感到满意绝对是一个好主意 - 我倾向于发现当没有涉及任何透明标识符(连接,让等)时,方法语法和查询表达式一样容易阅读,有时候更简单 - 但是当涉及多个范围变量时,查询表达式会简化事情。

答案 1 :(得分:1)

您可以使用SelectMany方法:

var query = data1.SelectMany(n1 => data2, (n1, n2) => n1 * n2);