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 編輯過