Language Integrated Query (LINQ) 是以將資料過濾、投影、排序、分組、查詢功能整合至 C# 語言的技術。傳統資料上列功能使用字串表示,不進行編譯時類型檢查,也不支援 IntelliSense。LINQ改變這種狀況,使上列功能成為語言的一部分,像類別、方法和事件一樣。 對於開發人員,LINQ 最明顯的「語言整合」部分是上列功能運算式,以宣告式「查詢語法」撰寫。這使得透過最少的程式碼,對資料來源進行過濾、投影、排序、分組。無論資料來源是 SQL 資料庫、ADO .NET 資料集、XML 文件還是 .NET 集合,基本查詢運算式模式都是相同的。 以下是 System.Linq 常見的類別和方法:
bool allGreaterThanTen = numbers.All(x => x > 10); bool anyGreaterThanTen = numbers.Any(x => x > 10); var enumerable = myObject.AsEnumerable(); List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; double average = numbers.Average(); Console.WriteLine("Average: " + average); var castedNumbers = mixedList.Cast<int>(); var concatenatedSequence = sequence1.Concat(sequence2); bool containsValue = sequence.Contains(42); int count = sequence.Count(); var defaultValueIfEmpty = sequence.DefaultIfEmpty(defaultValue); var distinctValues = sequence.Distinct(); var element = sequence.ElementAt(5); var elementOrDefault = sequence.ElementAtOrDefault(5); var exceptSequence = sequence1.Except(sequence2); var firstElement = sequence.First(); var firstOrDefaultElement = sequence.FirstOrDefault(); var groupedData = sequence.GroupBy(x => x.Category); var intersectedValues = sequence1.Intersect(sequence2); var lastElement = sequence.Last(); var lastOrDefaultElement = sequence.LastOrDefault(); var maxValue = sequence.Max(); var minValue = sequence.Min(); List<int> numbers = new List<int> { 5, 2, 8, 3, 1 }; var orderedNumbers = numbers.OrderBy(num => num); foreach (var num in orderedNumbers) { Console.WriteLine(num); } var orderedDescendingSequence = sequence.OrderByDescending(x => x.Age); var reversedSequence = sequence.Reverse(); List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; var squaredNumbers = numbers.Select(num => num * num); foreach (var num in squaredNumbers) { Console.WriteLine(num); } var skippedSequence = sequence.Skip(5); var sum = sequence.Sum(); var takenSequence = sequence.Take(10); var array = sequence.ToArray(); var list = sequence.ToList(); var lookup = sequence.ToLookup(x => x.Category); List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = numbers.Where(num => num % 2 == 0); foreach (var num in evenNumbers) { Console.WriteLine(num); }
ascending:升序。 descending:降序。
範例:找出整數陣列內大於 80 的數字,按降序列出。 ![]() 執行結果 ![]() 範例:找出整數陣列內大於 60 的數字,按升序列出。 ![]() 執行結果 ![]() 範例:找出整數陣列內大於 60 的數量。 ![]() 執行結果 ![]() 範例:找出整數陣列內大於 60 的最大數字。 ![]() 執行結果 ![]() 範例:找出整數陣低於 60 的第一個數字。 using static System.Formats.Asn1.AsnWriter; class Program { static void Main() { int[] scores = { 78, 91, 34, 82, 57, 24, 13, 18, 46 }; int below60 = scores.FirstOrDefault(執行結果 ![]() 範例:將資料分成 3 組,偶數 一組,5 的倍數一組,剩下的一組。 using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { int[] scores = { 78, 95, 20, 37, 55, 28, 13, 17, 30, 19 }; var groupedScores = scores .GroupBy(score => score % 2 == 0 ? "Even" : (score % 5 == 0 ? "MultipleOf5" : "Remaining")) .ToDictionary(group => group.Key, group => group.ToList()); Console.WriteLine("Scores grouped by conditions:"); //groupedScores.ForEach(group => Console.WriteLine($"Group: {group.Key}\n{string.Join(" ", group.Value)}")); foreach (var group in groupedScores) { Console.WriteLine($"Group: {group.Key}"); Console.Write(string.Join(" ", group.Value)); } } }執行結果 ![]() 範例: 第 1 個英文字母對應數字如下:
以身分證號碼 S123456789 為例。
sum % 10 == 0 則正確,否則錯誤。 程式碼: using System; using System.Text.RegularExpressions; class Program { /// <summary> /// 查核身分證是否正確 /// </summary> /// <param name="idNumber">身分證號碼</param> /// <returns>正確傳回 "正確" 否則 "格式錯誤或數值錯誤"</returns> static string ValidateIDNumber(string idNumber) { idNumber = idNumber.執行結果 ![]() 範例:計算字串中有幾個大寫字母。 int uppercaseCount = inputString.Count(char.IsUpper); 範例:計算字串中有幾個小寫字母。 int lowercaseCount = inputString.Count(char.IsLower); 範例:計算字串中有幾個阿拉伯數字。 int digitCount = inputString.Count(char.IsDigit); 範例:找尋字串中最大整數。 // 使用正規表達式匹配所有數字 var matches = Regex.Matches(inputString, @"\d+"); // 使用 LINQ 表達式找到最大整數 int maxNumber = matches.Cast |