From e456a5a39a77690bc18f9363b6885483507b7452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E7=A2=A7=E4=BB=99?= Date: Sun, 15 Dec 2024 00:07:25 +0800 Subject: [PATCH] =?UTF-8?q?linq=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2024-12-11Linq\346\237\245\350\257\242.md" | 28 +++ ...51\345\261\225\350\257\255\346\263\225.md" | 205 ++++++++++++++++++ 2 files changed, 233 insertions(+) create mode 100644 "\351\203\221\347\242\247\344\273\231/2024-12-11Linq\346\237\245\350\257\242.md" create mode 100644 "\351\203\221\347\242\247\344\273\231/2024-12-13Linq\346\211\251\345\261\225\350\257\255\346\263\225.md" diff --git "a/\351\203\221\347\242\247\344\273\231/2024-12-11Linq\346\237\245\350\257\242.md" "b/\351\203\221\347\242\247\344\273\231/2024-12-11Linq\346\237\245\350\257\242.md" new file mode 100644 index 0000000..05c023f --- /dev/null +++ "b/\351\203\221\347\242\247\344\273\231/2024-12-11Linq\346\237\245\350\257\242.md" @@ -0,0 +1,28 @@ +## Lambda表达式 +Lambda表达式是C#中引入的一种简洁的匿名函数语法。它们允许你以简洁的方式编写内联函数,这些函数可以被赋值给变量、作为参数传递或在表达式树中使用。 + + +Lambda表达式由几个部分组成: + +1. 参数列表:可以是一个或多个参数,参数可以被省略类型,编译器会根据上下文推断类型。 + +2. Lambda操作符 (=>):分隔参数列表和Lambda体。 + +3. Lambda体:可以是一个表达式或一个代码块。如果是表达式,结果将直接作为Lambda的返回值;如果是代码块,需要显式返回值。 + + +## Linq查询 +1. 查询表达式是一种使用查询语法表示的表达式,它用于查询和转换来自任意支持LINQ的数据源中的数据。 +2. 查询表达式使用常见的C#语言构造,易读简洁,容易掌握。 +3. 它由一组类似于SQL或XQuery的声明性语法编写的子句组成。 +4. 每一个子句可以包含一个或多个C#表达式,这些C#表达式本身也可能是查询表达式或包含查询表达式。 + + Where 方法会基于指定的条件筛选集合中的元素。 + Select 方法会将集合中的每个元素投影(或转换)为新的形式。 + Any 方法会检查集合中是否存在满足特定条件的元素。 + Count 方法会返回集合中元素的数量,或者满足特定条件的元素数量。 + Concat 方法会将两个或多个序列合并为一个序列。 + Distinct 方法会返回序列中的唯一元素。(去重) + OrderBy 和 OrderByDescending 方法会根据指定的键对序列进行排序。 + ToArray 方法会将序列转换为一个数组。 + ToList 方法会将序列转换为一个列表。 diff --git "a/\351\203\221\347\242\247\344\273\231/2024-12-13Linq\346\211\251\345\261\225\350\257\255\346\263\225.md" "b/\351\203\221\347\242\247\344\273\231/2024-12-13Linq\346\211\251\345\261\225\350\257\255\346\263\225.md" new file mode 100644 index 0000000..9fceb20 --- /dev/null +++ "b/\351\203\221\347\242\247\344\273\231/2024-12-13Linq\346\211\251\345\261\225\350\257\255\346\263\225.md" @@ -0,0 +1,205 @@ +## 标准查询操作符及例子 +这些是LINQ中最常用的扩展方法,它们被定义在System.Linq命名空间中。 + +1. Where - 筛选 + + List numbers = new List { 1, 2, 3, 4, 5 }; + var evenNumbers = numbers.Where(n => n % 2 == 0); // 筛选出偶数 + +2. Select - 投影 + + var squares = numbers.Select(n => n * n); // 将每个数字映射为其平方 + +3. SelectMany - 扁平化 + + List> a = new List> { + new List { 1, 2 }, + new List { 3, 4 } + }; + var b = a.SelectMany(list => list); // 将多个列表扁平化为一个列表 + +4. OrderBy/OrderByDescending - 排序 + + var c = numbers.OrderBy(n => n); // 升序排序 + var d= numbers.OrderByDescending(n => n); // 降序排序 + +5. GroupBy - 分组 + + var e= numbers.GroupBy(n => n % 2 == 0); // 根据数字是否为偶数进行分组 + +6. Aggregate - 聚合 + + int sum = numbers.Aggregate((total, n) => total + n); // 计算总和 + +7. Join - 联接 + + List f= new List { "apple", "banana", "cherry" }; + var g = words.Select(word => word.ToUpper()); // 将单词转换为大写 + var h = string.Join(", ", g); // 用逗号连接单词 + +辅助方法 +1. Count - 计数 + + int count = numbers.Count(); // 计算集合中的元素数量 + +2. Any/All - 存在/全部 + + bool hasEven = numbers.Any(n => n % 2 == 0); // 检查是否有偶数 + bool allPositive = numbers.All(n => n > 0); // 检查所有数字是否都大于0 + +3. Contains - 包含 + + bool containsThree = numbers.Contains(3); // 检查集合中是否包含数字3 + +4. DefaultIfEmpty - 默认值 + + IEnumerable emptyList = Enumerable.Empty(); + var defaultList = emptyList.DefaultIfEmpty(-1); // 如果集合为空,则返回-1 + +## 常见的扩展方法及例子 +1. First / FirstOrDefault + +- First():返回集合中的第一个元素。 +- FirstOrDefault():返回集合中的第一个元素,如果集合为空,则返回默认值。 + + List numbers = new List { 1, 2, 3, 4, 5 }; + int firstNumber = numbers.First(); // 返回1 + int firstEvenNumber = numbers.FirstOrDefault(n => n % 2 == 0); // 返回2 + +2. Last / LastOrDefault +- Last():返回集合中的最后一个元素。 +- LastOrDefault():返回集合中的最后一个元素,如果集合为空,则返回默认值。 + + int lastNumber = numbers.Last(); // 返回5 + int lastEvenNumber = numbers.LastOrDefault(n => n % 2 == 0); // 返回4 + +3. Single / SingleOrDefault +- Single():返回集合中的唯一元素,如果集合不包含恰好一个元素,则抛出异常。 +- SingleOrDefault():返回集合中的唯一元素,如果集合为空或包含多个元素,则返回默认值。 + + List singleNumberList = new List { 42 }; + int singleNumber = singleNumberList.Single(); // 返回42 +4. ElementAt / ElementAtOrDefault +- ElementAt():返回集合中指定索引位置的元素。 +- ElementAtOrDefault():返回集合中指定索引位置的元素,如果索引超出范围,则返回默认值。 + + int thirdNumber = numbers.ElementAt(2); // 返回3 + int fifthNumberOrDefault = numbers.ElementAtOrDefault(5); // 返回默认值0 +5. Sum +计算集合中所有元素的总和。 + + int sum = numbers.Sum(); // 返回15 +6. Average +计算集合中所有元素的平均值。 + + + double average = numbers.Average(); // 返回3.0 + +7. Min / Max +- Min():返回集合中最小值。 +- Max():返回集合中最大值。 + + int minNumber = numbers.Min(); // 返回1 + int maxNumber = numbers.Max(); // 返回5 + +8. Take / TakeWhile +- Take():返回集合中前N个元素。 +- TakeWhile():返回集合中满足条件的前N个元素。 + + var firstThreeNumbers = numbers.Take(3); // 返回{1, 2, 3} + var firstThreeEvenNumbers = numbers.TakeWhile(n => n <= 2); // 返回{1, 2} + +9. Skip / SkipWhile +- Skip():跳过集合中前N个元素,返回剩余元素。 +- SkipWhile():跳过集合中满足条件的前N个元素,返回剩余元素。 + + var numbersAfterFirstThree = numbers.Skip(3); // 返回{4, 5} + var numbersAfterFirstEven = numbers.SkipWhile(n => n <= 2); // 返回{3, 4, 5} + +10. Distinct +返回集合中不重复的元素。 + + List numbersWithDuplicates = new List { 1, 2, 2, 3, 4, 4, 5 }; + var distinctNumbers = numbersWithDuplicates.Distinct(); // 返回{1, 2, 3, 4, 5} + +11. Concat +连接两个集合。 + + List secondList = new List { 6, 7, 8 }; + var concatenatedList = numbers.Concat(secondList); // 返回{1, 2, 3, 4, 5, 6, 7, 8} + +12. Any / All +- Any():检查集合中是否至少有一个元素满足条件。 +- All():检查集合中的所有元素是否都满足条件。 + + bool hasAnyEven = numbers.Any(n => n % 2 == 0); // true + bool allArePositive = numbers.All(n => n > 0); // true + +13. SequenceEqual +检查两个集合是否按相同的顺序包含相同的元素。 + + List list1 = new List { 1, 2, 3 }; + List list2 = new List { 1, 2, 3 }; + bool areSequencesEqual = list1.SequenceEqual(list2); // true + +14. Reverse +反转集合中元素的顺序。 + + var reversedNumbers = numbers.Reverse(); // 返回{5, 4, 3, 2, 1} + +15. DefaultIfEmpty +返回一个新的集合,如果原集合为空,则包含一个指定的默认值。 + + IEnumerable emptyCollection = Enumerable.Empty(); + var defaultCollection = emptyCollection.DefaultIfEmpty(-1); // 返回{-1} + +16. OfType +筛选出特定类型的元素。 + + var objects = new List { 1, "two", 3, "four" }; + var strings = objects.OfType(); // 返回{"two", "four"} + +17. Cast / Convert +将集合中的元素转换为指定类型。 + + var mixedArray = new object[] { 1, 2, "three", 4 }; + var castToInt = mixedArray.Cast(); // 尝试将所有元素转换为int + +18. GroupJoin / Join +类似于 SQL 中的 JOIN 操作,可以基于一个共同的键将两个集合结合起来。 + + var people = new List { /* ... */ }; + var pets = new List { /* ... */ }; + var personPetJoin = + people.GroupJoin( + pets, + person => person.Id, + pet => pet.OwnerId, + (person, petGroup) => new { person, petGroup }); +19. Zip +将两个集合中的对应元素配对。 + + int[] numbers = { 1, 2, 3 }; + string[] words = { "one", "two", "three" }; + var pairs = numbers.Zip(words, (number, word) => new { number, word }); // 返回{ {1, "one"}, {2, "two"}, {3, "three"} } +20. Union +合并两个集合,去除重复项。 + + List firstList = new List { 1, 2, 3 }; + List secondList = new List { 3, 4, 5 }; + var unionList = firstList.Union(secondList); // 返回{1, 2, 3, 4, 5} + +21. Intersect +找出两个集合的交集。 + + var intersection = firstList.Intersect(secondList); // 返回{3} +22. Except +找出在第一个集合中但不在第二个集合中的元素。 + + var difference = firstList.Except(secondList); // 返回{1, 2} + +23. AsEnumerable +将非泛型集合转换为泛型 IEnumerable。 + + ArrayList arrayList = new ArrayList { 1, 2, 3 }; + var query = arrayList.AsEnumerable(); // 返回 IEnumerable \ No newline at end of file -- Gitee