跳转到内容

C Sharp LINQ 方法语法

来自代码酷

模板:编程概念导航

简介[编辑 | 编辑源代码]

LINQ(Language Integrated Query,语言集成查询)是C#中用于查询数据的强大技术,它允许开发者使用类似SQL的语法或链式方法调用来操作集合、数据库、XML等数据源。方法语法(Method Syntax)是LINQ的两种主要表达方式之一(另一种是查询语法),它通过扩展方法(如Where()Select())实现链式调用,更符合函数式编程风格。

方法语法的核心特点:

  • 基于Lambda表达式,代码更紧凑。
  • 支持所有LINQ操作(包括查询语法无法直接表达的操作,如Count()First())。
  • 可与其他C#代码无缝结合。

基础方法语法示例[编辑 | 编辑源代码]

以下示例展示如何用方法语法过滤和转换数据:

  
using System;  
using System.Linq;  
using System.Collections.Generic;  

class Program  
{  
    static void Main()  
    {  
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };  

        // 方法语法:筛选偶数并平方  
        var result = numbers  
            .Where(n => n % 2 == 0)  
            .Select(n => n * n);  

        Console.WriteLine(string.Join(", ", result)); // 输出: 4, 16, 36  
    }  
}
    • 代码解释**:

1. Where(n => n % 2 == 0):过滤出偶数(Lambda表达式作为谓词)。 2. Select(n => n * n):将每个元素平方。 3. 方法链的执行是延迟的(惰性求值),直到遍历结果时才实际计算。

常用LINQ方法[编辑 | 编辑源代码]

以下是方法语法中高频操作符的分类说明:

过滤操作[编辑 | 编辑源代码]

  • Where():根据条件筛选元素。
  • OfType<T>():筛选指定类型的元素。

投影操作[编辑 | 编辑源代码]

  • Select():转换元素形式。
  • SelectMany():展开嵌套集合(如将列表的列表扁平化)。

排序操作[编辑 | 编辑源代码]

  • OrderBy() / OrderByDescending():升序/降序排序。
  • ThenBy():次要排序条件。

聚合操作[编辑 | 编辑源代码]

  • Count() / Sum() / Average():统计计算。
  • Aggregate():自定义累积运算。

分组与连接[编辑 | 编辑源代码]

  • GroupBy():按键分组。
  • Join():内连接两个数据源。

实际应用案例[编辑 | 编辑源代码]

    • 场景**:处理电商订单数据,统计每个客户的消费总额。
  
using System;  
using System.Linq;  
using System.Collections.Generic;  

class Order  
{  
    public int OrderId { get; set; }  
    public string Customer { get; set; }  
    public decimal Amount { get; set; }  
}  

class Program  
{  
    static void Main()  
    {  
        List<Order> orders = new List<Order>  
        {  
            new Order { OrderId = 1, Customer = "Alice", Amount = 100 },  
            new Order { OrderId = 2, Customer = "Bob", Amount = 200 },  
            new Order { OrderId = 3, Customer = "Alice", Amount = 150 }  
        };  

        var customerSpending = orders  
            .GroupBy(o => o.Customer)  
            .Select(g => new  
            {  
                Customer = g.Key,  
                Total = g.Sum(o => o.Amount)  
            });  

        foreach (var item in customerSpending)  
            Console.WriteLine($"{item.Customer}: ${item.Total}");  
    }  
}
    • 输出**:
  
Alice: $250  
Bob: $200  

方法语法 vs 查询语法[编辑 | 编辑源代码]

对比表
特性 方法语法 查询语法
表达方式 链式方法调用 SQL风格关键字
灵活性 支持所有操作 部分操作需结合方法语法(如Count()
可读性 适合简单链式操作 复杂查询更直观

性能注意事项[编辑 | 编辑源代码]

  • 延迟执行:LINQ查询通常延迟执行,直到实际迭代结果时才会计算。
  • 立即执行:使用ToList()ToArray()或聚合方法(如Count())会立即触发查询。
  • 复杂查询可能生成低效SQL(尤其在Entity Framework中),需监控生成的SQL语句。

进阶技巧[编辑 | 编辑源代码]

组合查询[编辑 | 编辑源代码]

方法语法可通过变量拆分复杂查询,提升可读性:

  
var filtered = collection.Where(x => x.IsActive);  
var sorted = filtered.OrderBy(x => x.Name);  
var final = sorted.Select(x => x.Id);

自定义扩展方法[编辑 | 编辑源代码]

通过扩展方法增强LINQ功能:

  
public static IEnumerable<T> WhereNotNull<T>(this IEnumerable<T> source)  
{  
    return source.Where(item => item != null);  
}  

// 使用  
var results = list.WhereNotNull();

总结[编辑 | 编辑源代码]

C# LINQ方法语法提供了灵活、强大的数据操作能力,尤其适合函数式编程风格。掌握核心方法(如WhereSelectGroupBy)和延迟执行机制,能显著提升代码简洁性与效率。建议结合实际项目需求练习,逐步熟悉更高级的用法。