LINQ入门详解:Linq to Objects核心解析
LINQ入门详解:Linq to Objects核心解析
LINQ(Language Integrated Query)是.NET框架中的一个重要特性,它允许开发者以一种统一的方式操作多种数据源。本文将详细介绍Linq to Objects的基本概念和使用方法。
前置技术基础
1. 隐式类型与匿名类型
隐式类型使用var关键字定义,编译器根据初始值推断类型。匿名类型是一个继承自Object的无名类,编译器会自动生成唯一的类名。
使用限制:
- 不能用于方法参数或返回值
- 必须显式赋值且不能为null
2. Lambda表达式与Func委托
Lambda表达式简化了匿名方法的书写,语法形式为:参数列表 => 表达式。
Func委托封装了具有输入参数和返回值的方法,常用的Func定义如下:
Func<T1, T2, TResult>
3. 扩展方法
扩展方法允许在不修改原类的情况下添加新功能。定义方式如下:
public static class Extensions {
public static TResult MyMethod<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) {
// 实现
}
}
4. 延迟计算与迭代器
延迟计算通过yield关键字实现,它将集合的遍历推迟到实际需要的时候。
public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> source, Func<T, bool> predicate) {
foreach (T item in source) {
if (predicate(item)) yield return item;
}
}
LINQ核心概念
1. LINQ组成
LINQ包括多个组件,每个组件针对不同的数据源:
| 组件 | 程序集 | 命名空间 | 描述 |
|---|---|---|---|
| LINQ to Objects | System.Core.dll | System.Linq | 操作内存中的集合 |
| LINQ to XML | System.Xml.Linq.dll | System.Xml.Linq | 操作XML数据 |
| LINQ to SQL | System.Data.Linq.dll | System.Data.Linq | 操作SQL Server数据 |
2. 查询语法与方法语法
查询语法通过from、where等关键字实现,而方法语法则通过调用扩展方法实现。两者本质上是相同的,只是语法形式不同。
Linq to Objects运算符详解
1. 过滤运算符
// 查询表达式
var drivers = from d in GetDrivers()
where d.Points > 100 && d.Team == "Red Bull"
select d;
// 方法语法
var drivers = GetDrivers().Where(d => d.Points > 100 && d.Team == "Red Bull");
2. 投影运算符
var names = drivers.Select(d => new { d.FirstName, d.LastName });
3. 排序运算符
var ordered = drivers.OrderBy(d => d.LastName).ThenBy(d => d.FirstName);
4. 连接运算符
var joined = drivers.Join(teams, d => d.TeamId, t => t.TeamId, (d, t) => new { d.Name, t.Championships });
5. 分组运算符
var grouped = drivers.GroupBy(d => d.Team);
6. 延迟计算注意事项
延迟计算意味着查询只有在被枚举时才会执行。以下示例展示了如何正确使用局部变量:
foreach (char item in "aeiou") {
char temp = item;
var filtered = data.Where(c => c != temp);
}