LINQ是“语言集成查询”(Language Integrated Query)的缩写。它使开发人员能够直观且高效地与集合进行交互。它为C#及其他.NET语言带来了类似SQL的查询功能,让从各种数据源(如集合、数据库和XML文件)中筛选、排序以及操作数据变得更加容易。
在本文中,我们将更深入地探究LINQ的三个核心方法,它们分别是Where
、OrderBy
和ThenBy
。这些方法主要用于帮助筛选和排序数据。
LINQ简介
LINQ让你能够轻松查询数据,无论数据来自何处。无论你处理的是列表、数据库还是XML文件,LINQ都使用相同的简单语法,该语法看上去与SQL非常相似。简单来说,如果你有任何数据库查询方面的经验,就能轻松学习LINQ。
LINQ的主要优势:
可读性:LINQ查询比传统的循环或手动构建的查询更具可读性。
类型安全性:由于LINQ查询是强类型的,所以你能在编译时捕获许多错误。
通用性:LINQ可用于各种数据源,如SQL数据库、XML、内存中的对象等等。
使用Where进行数据筛选
Where
方法是LINQ中的一个方法,它允许我们基于某个条件或谓词来筛选集合。它将条件应用于集合中的每个元素,并仅返回那些符合条件的元素。
语法:
IEnumerable<T> Where(Func<T, bool> predicate);
其中,predicate
是一个表示条件的函数。它从集合中获取一个元素,如果该元素应包含在结果中,则返回true
,否则返回false
。
基于简单条件进行筛选
假设你有一个整数列表,并且想要筛选出大于5的数字。以下是使用Where
方法实现此操作的方式:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 筛选大于5的数字
var filteredNumbers = numbers.Where(n => n > 5);
foreach (var number in filteredNumbers)
{
Console.WriteLine(number);
}
输出:
6
7
8
9
10
在这个示例中:
基于对象属性进行筛选
现在,让我们基于特定属性来筛选一个对象列表。假设我们有一个Person
对象列表,并且想要筛选出年龄大于30岁的人员。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
List<Person> people = new List<Person>
{
new Person { Name = "John", Age = 28 },
new Person { Name = "Jane", Age = 35 },
new Person { Name = "Mike", Age = 40 }
};
// 筛选年龄大于30岁的人员
var filteredPeople = people.Where(p => p.Age > 30);
foreach (var person in filteredPeople)
{
Console.WriteLine($"{person.Name} is {person.Age} years old.");
}
输出:
Jane is 35 years old.
Mike is 40 years old.
在这种情况下:
使用OrderBy进行数据排序
OrderBy
方法用于根据你指定的键按升序对数据进行排序。它通过比较集合中元素的键,并将它们按升序排列来实现排序功能。
语法:
IOrderedEnumerable<T> OrderBy<TKey>(Func<T, TKey> keySelector);
其中,keySelector
是一个定义了将依据其对集合进行排序的键的函数,该键通常是一个属性或字段。
按升序排序
让我们使用OrderBy
方法对一个整数列表按升序进行排序:
List<int> numbers = new List<int> { 10, 3, 7, 1, 9 };
// 按升序对数字进行排序
var sortedNumbers = numbers.OrderBy(n => n);
foreach (var number in sortedNumbers)
{
Console.WriteLine(number);
}
输出:
1
3
7
9
10
在这里,OrderBy
方法根据每个元素的数值对列表按升序进行排序。
按对象属性排序
现在,让我们按Person
对象的Name
属性以字母顺序对一个Person
对象列表进行排序:
List<Person> people = new List<Person>
{
new Person { Name = "John", Age = 28 },
new Person { Name = "Jane", Age = 35 },
new Person { Name = "Mike", Age = 40 }
};
// 按姓名对人员进行排序
var sortedPeople = people.OrderBy(p => p.Name);
foreach (var person in sortedPeople)
{
Console.WriteLine($"{person.Name} is {person.Age} years old.");
}
输出:
Jane is 35 years old.
John is 28 years old.
Mike is 40 years old.
OrderBy
方法根据Person
对象的Name
属性按升序对列表进行排序。
使用ThenBy进行二级排序
在对数据进行排序时,有时你可能希望应用多级排序。例如,你可能希望先按一个属性(如Age
)对列表进行排序,然后在遇到两个元素对于第一个属性具有相同值的情况下,再按另一个属性(如Name
)进行排序。这时ThenBy
方法就派上用场了。
语法:
IOrderedEnumerable<T> ThenBy<TKey>(Func<T, TKey> keySelector);
ThenBy
方法在初始的OrderBy
或OrderByDescending
之后执行二级排序。
多级排序
让我们先按Age
对Person
列表进行排序,然后再按Name
排序:
List<Person> people = new List<Person>
{
new Person { Name = "John", Age = 28 },
new Person { Name = "Jane", Age = 35 },
new Person { Name = "Alice", Age = 35 },
new Person { Name = "Mike", Age = 28 }
};
// 先按年龄排序,再按姓名排序
var sortedPeople = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
foreach (var person in sortedPeople)
{
Console.WriteLine($"{person.Name}, {person.Age} years old");
}
输出:
John, 28 years old
Mike, 28 years old
Alice, 35 years old
Jane, 35 years old
解释:
使用OrderByDescending和ThenByDescending按降序排序
当你希望按降序对数据进行排序时,可以使用LINQ中的OrderByDescending
和ThenByDescending
方法来实现此目的。
使用OrderByDescending按降序排序
List<int> numbers = new List<int> { 10, 3, 7, 1, 9 };
// 按降序排序
var sortedNumbersDesc = numbers.OrderByDescending(n => n);
foreach (var number in sortedNumbersDesc)
{
Console.WriteLine(number);
}
输出:
10
9
7
3
1
使用ThenByDescending进行二级降序排序
就像ThenBy
一样,你可以使用ThenByDescending
进行二级降序排序。例如:
var sortedPeopleDesc = people.OrderByDescending(p => p.Age).ThenByDescending(p => p.Name);
在复杂查询中结合使用Where、OrderBy和ThenBy
在实际场景中,你很少单独进行筛选或排序操作。通常,你需要筛选一个集合以仅获取相关项,然后基于多个条件对筛选后的结果进行排序。由于LINQ流畅的语法允许你组合多个方法,所以在LINQ中,这种筛选和排序的组合操作非常简单直接。
以下是在复杂查询中Where
、OrderBy
和ThenBy
组合使用的方式示例:
var filteredAndSortedPeople = people
.Where(p => p.Age > 30)
.OrderBy(p => p.Age)
.ThenBy(p => p.Name);
foreach (var person in filteredAndSortedPeople)
{
Console.WriteLine($"{person.Name}, {person.Age} years old");
}
在这个示例中,我们首先使用Where
方法筛选人员列表,仅保留年龄大于30岁的人员。然后,使用OrderBy
方法按年龄升序对筛选后的列表进行排序。如果两个人年龄相同,我们使用ThenBy
方法按姓名的字母顺序进行二级排序。最后,我们输出经过筛选和排序后的人员列表。
LINQ为在C#中筛选和排序数据提供了一种强大的方式。Where
方法非常适合基于条件筛选集合,而OrderBy
、ThenBy
、OrderByDescending
和ThenByDescending
则让你能够完全掌控数据的排序方式。掌握这些方法将使你能够为数据操作编写简洁、可读且高效的代码。
该文章在 2024/12/13 9:08:36 编辑过