LINQ(Language Integrated Query)是C#和.NET框架中的一个强大功能,它允许开发者使用查询语法来访问和操作数据集合。LINQ提供了一种一致且直观的方式来处理不同类型的数据源,如集合、XML文档、数据库等。本文将详细讲解LINQ的各种属性和方法,以及如何在实际应用中使用它们。
1. LINQ 简介
LINQ 提供了一种声明性的语法,类似于SQL,可以对任何实现了 IEnumerable<T>
或 IQueryable<T>
接口的数据源进行查询。它有以下几个主要的部分:
- LINQ to Objects:对内存中的对象进行查询。
- LINQ to XML:对XML数据进行查询。
- LINQ to SQL:对SQL数据库进行查询。
- LINQ to Entities:对Entity Framework数据模型进行查询。
2. 基本语法
2.1 查询表达式
查询表达式类似于SQL语法,主要由from
、where
、select
等子句组成。例如:
// 定义数据源
int[] numbers = { 2, 3, 4, 5 };// 定义查询表达式
var result = from n in numberswhere n % 2 == 0select n;// 执行查询
foreach (var n in result)
{Console.WriteLine(n);
}
2.2 方法语法
LINQ也可以使用方法调用链来表达查询,这种语法通常与Lambda表达式一起使用。例如:
// 定义数据源
int[] numbers = { 2, 3, 4, 5 };// 定义查询
var result = numbers.Where(n => n % 2 == 0).Select(n => n);// 执行查询
foreach (var n in result)
{Console.WriteLine(n);
}
3. 常用方法
3.1 Where
Where
方法用于筛选数据集合中的元素。它接受一个返回布尔值的Lambda表达式作为参数。例如:
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);foreach (var n in evenNumbers)
{Console.WriteLine(n); // 输出 2 和 4
}
3.2 Select
Select
方法用于将数据集合中的每个元素投射为新的形式。它接受一个Lambda表达式作为参数。例如:
int[] numbers = { 1, 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(n => n * n);foreach (var n in squaredNumbers)
{Console.WriteLine(n); // 输出 1, 4, 9, 16, 25
}
3.3 OrderBy 和 OrderByDescending
OrderBy
和 OrderByDescending
方法用于对数据集合进行排序。它们接受一个用于排序的键选择器Lambda表达式。例如:
string[] names = { "Charlie", "Bob", "Alice" };
var sortedNames = names.OrderBy(name => name);foreach (var name in sortedNames)
{Console.WriteLine(name); // 输出 Alice, Bob, Charlie
}var sortedNamesDesc = names.OrderByDescending(name => name);foreach (var name in sortedNamesDesc)
{Console.WriteLine(name); // 输出 Charlie, Bob, Alice
}
3.4 GroupBy
GroupBy
方法用于将数据集合中的元素分组。它接受一个分组键选择器Lambda表达式。例如:
string[] words = { "apple", "banana", "apricot", "blueberry", "cherry" };
var groupedWords = words.GroupBy(word => word[0]);foreach (var group in groupedWords)
{Console.WriteLine($"Key: {group.Key}");foreach (var word in group){Console.WriteLine(word);}
}
3.5 Join
Join
方法用于连接两个数据集合。它接受四个参数:外部集合、内部集合、外键选择器、内键选择器和结果选择器。例如:
var students = new[]
{new { StudentId = 1, Name = "Alice" },new { StudentId = 2, Name = "Bob" }
};var scores = new[]
{new { StudentId = 1, Score = 90 },new { StudentId = 2, Score = 85 }
};var studentScores = students.Join(scores,student => student.StudentId,score => score.StudentId,(student, score) => new { student.Name, score.Score }
);foreach (var studentScore in studentScores)
{Console.WriteLine($"{studentScore.Name}: {studentScore.Score}");
}
4. 高级用法
4.1 集合运算符
LINQ 提供了一些集合运算符,如 Union
、Intersect
和 Except
,用于对集合进行并集、交集和差集操作。例如:
int[] set1 = { 1, 2, 3 };
int[] set2 = { 3, 4, 5 };var union = set1.Union(set2); // { 1, 2, 3, 4, 5 }
var intersect = set1.Intersect(set2); // { 3 }
var except = set1.Except(set2); // { 1, 2 }foreach (var n in union) { Console.WriteLine(n); }
foreach (var n in intersect) { Console.WriteLine(n); }
foreach (var n in except) { Console.WriteLine(n); }
4.2 聚合函数
LINQ 提供了一些聚合函数,如 Count
、Sum
、Average
、Min
和 Max
,用于对集合进行聚合计算。例如:
int[] numbers = { 1, 2, 3, 4, 5 };int count = numbers.Count(); // 5
int sum = numbers.Sum(); // 15
double average = numbers.Average(); // 3
int min = numbers.Min(); // 1
int max = numbers.Max(); // 5Console.WriteLine($"Count: {count}, Sum: {sum}, Average: {average}, Min: {min}, Max: {max}");
4.3 转换运算符
LINQ 提供了一些转换运算符,如 ToList
、ToArray
和 ToDictionary
,用于将查询结果转换为其他集合类型。例如:
int[] numbers = { 1, 2, 3, 4, 5 };List<int> numberList = numbers.ToList();
int[] numberArray = numbers.ToArray();
Dictionary<int, int> numberDictionary = numbers.ToDictionary(n => n, n => n * n);foreach (var n in numberList) { Console.WriteLine(n); }
foreach (var n in numberArray) { Console.WriteLine(n); }
foreach (var kvp in numberDictionary) { Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); }
5. 实际应用中的例子
5.1 处理数据库
LINQ to SQL 或 LINQ to Entities(EF)可以用于查询数据库。例如,使用 Entity Framework:
using (var context = new SchoolContext())
{var students = context.Students.Where(s => s.Age > 18).ToList();foreach (var student in students){Console.WriteLine($"{student.Name}, {student.Age}");}
}
5.2 处理XML
LINQ to XML 可以用于查询和操作XML文档。例如:
XDocument doc = XDocument.Load("books.xml");var books = from book in doc.Descendants("book")where (int)book.Element("price") > 30select new{Title = (string)book.Element("title"),Price = (int)book.Element("price")};foreach (var book in books)
{Console.WriteLine($"{book.Title}, {book.Price}");
}
LINQ 在 C# 中非常强大且灵活的功能,它提供了多种操作数据集合的方式,让我们的代码更加简洁和可读。本文记录一下这些常用到的,以后可以来翻一翻