我能用Lambda(方法语法)而不是(查询语法)执行什么查询?

Rol*_*oll 3 .net c# linq lambda

我能用Lambda(方法语法)而不是(查询语法)执行什么查询?

问题很简单,这是两个例子:

    int[] numbers = { 5, 10, 8, 3, 6, 12};

    //Query syntax:
    IEnumerable<int> numQuery1 = 
        from num in numbers
        where num % 2 == 0
        orderby num
        select num;

    //Method syntax:
    IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);
Run Code Online (Sandbox Code Playgroud)

什么是查询,我可以执行方法语法而不是查询语法?

Jon*_*eet 5

(这是一个比我最初写的更短的答案,但其他答案已经提供了一些细节.)

人们可能希望使用lambda表达式而不是查询表达式有两个原因:

  • 简单地不被查询表达式覆盖的操作,是否完全没有涵盖的方法(例如Count)或查询表达式包含的操作的重载,但不包括在该形式中.例如:

    var indexedValues = values.Select((value, index) => new { value, index });
    
    Run Code Online (Sandbox Code Playgroud)

    没有使用该重载的查询表达式表单.

  • 当lambda形式更简单.例如,如果您只有一个投影或过滤器,则在一次调用中执行此操作比设置查询表达式的绒毛更简单:

     var adults = people.Where(person => person.Age > 18);
    
    Run Code Online (Sandbox Code Playgroud)

    VS:

     var adults = from person in people
                  where person.Age > 18
                  select person;
    
    Run Code Online (Sandbox Code Playgroud)

    此外,如果要在查询后继续表达式,则lambda表达式方法稍微整洁一些.例如,创建成人姓名列表:

     var names = people.Where(person => person.Age > 18)
                       .Select(person => person.Name)
                       .ToList();
    
    Run Code Online (Sandbox Code Playgroud)

    VS:

     var names = (from person in people
                  where person.Age > 18
                  select person.Name).ToList();
    
    Run Code Online (Sandbox Code Playgroud)

    括号最终有点刺激.

当查询表达式闪耀在其中介绍的操作透明标识符 -联接,SelectMany,let等等.虽然你明明可以翻译这样的代码为拉姆达的形式,它可以结束了真难看.