C# 转换为LINQ lambda表达式

C# 转换为LINQ lambda表达式,c#,linq,C#,Linq,简单行: var x = (from a in arr select a).First(); Console.WriteLine(“First" + x); 如何转换为Lambda表达式?那么您想将LINQ查询从使用查询语法转换为普通扩展方法调用吗 // var first = (from a in arr select a).First(); var first = arr.First(); // var last = (from a in arr select a).Last(); va

简单行:

var x = (from a in arr select a).First();
Console.WriteLine(“First" + x);

如何转换为Lambda表达式?

那么您想将LINQ查询从使用查询语法转换为普通扩展方法调用吗

// var first = (from a in arr select a).First();
var first = arr.First();

// var last = (from a in arr select a).Last();
var last = arr.Last();

// var filtered = (from a in arr where a == 10 select a).First();
// there are a couple of ways to write this:
var filtered1 = arr.Where(a => a == 10)
                   .First();
var filtered2 = arr.First(a => a == 10); // produces the same result but obtained differently

// now a very complex query (leaving out the type details)
// var query = from a in arr1
//             join b in arr2 on a.SomeValue equals b.AnotherValue
//             group new { a.Name, Value = a.SomeValue, b.Date }
//                 by new { a.Name, a.Group } into g
//             orderby g.Key.Name, g.Key.Group descending
//             select new { g.Key.Name, Count = g.Count() };
var query = arr1.Join(arr2,
                      a => a.SomeValue,
                      b => b.AnotherValue,
                      (a, b) => new { a, b })
                .GroupBy(x => new { x.a.Name, x.a.Group },
                         x => new { x.a.Name, Value = x.a.SomeValue, x.b.Date })
                .OrderBy(g => g.Key.Name)
                .ThenByDescending(g => g.Key.Group)
                .Select(g => new { g.Key.Name, Count = g.Count() });

当您在x中有一个y-in-x-select-y形式的表达式时,您几乎总是可以写x来代替它。

=>arr.First?第一行和第二行似乎不同步-代码段中有错误吗?第一行只是var x=arr。第一行我不知道最后一个变量指的是什么…是的,使用查询语法与普通扩展方法调用相比有什么优势?Yur代码比我的代码短,那么为什么要在allalso使用基于查询的表达式?如果表达式从a读入,a==10,请首先选择a@学习:对于这样一个简单的查询,您在这里看不到它的任何优点。您将看到它将更容易阅读,尤其是如果您有一个非常复杂的查询,包括联接、分组、排序等@learningdb:您的特定示例不需要任何查询理解语义,因此不会从中受益。其他查询可能是,例如,来自arr中的,其中a!=0让b=somefunc1.0/a,其中b<1选择新的{a,b};在这种情况下,它仍然调用.Selectx=>x,它不必返回完全相同的内容。有趣的是,如果你在where etc后面加上一个普通的投影,它不会调用.Selectx=>x,但是如果投影是你唯一要做的事情,它会调用.Selectx=>x。谢谢你指出这一点。我不应该在这个论坛上胡乱作概括-我已经用适当的限定词修改了我的答案。如果你想知道为什么会这样做,那是为了确保查询不只是返回原始集合。埃里克·利珀特在书中解释了这一点。