From 9684f7c9e41d16d639ca4e01bce1d5490f880261 Mon Sep 17 00:00:00 2001 From: Willxup <51990395+Willxup@users.noreply.github.com> Date: Fri, 12 Apr 2024 16:52:44 +0800 Subject: [PATCH] doc: update docs/cs.md (#609) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 增加国内镜像 * add reference of syntax sugar for c# * optimizing page format for cs.md * optimizing page format for cs.md * add reference of linq for c# --- docs/cs.md | 261 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) diff --git a/docs/cs.md b/docs/cs.md index 35606f6..d6f71ea 100644 --- a/docs/cs.md +++ b/docs/cs.md @@ -1065,6 +1065,267 @@ bool hasKey2 = hashTable.ContainsKey("key2"); string valueOfKey2 = (string)hashTable["key2"]; ``` + + +LINQ +-------- + +> C#语言中的LINQ(Language-Integrated Query)是一种强大的查询语言,它提供了一种统一的编程模型,使得数据查询变得更加直观和简洁。 + + + +### FROM + + + +> 任何数据源,包括对象集合、数据库、XML等。 + + + +### WHERE + + + +> 条件查询 + +```cs +// 示例数据源 +List students = new List +{ + new Student { Name = "Alice", Age = 25, Grade = "A" }, + new Student { Name = "Bob", Age = 30, Grade = "B" }, + new Student { Name = "Barry", Age = 35, Grade = "C" }, + new Student { Name = "Charlie", Age = 22, Grade = "A" }, + new Student { Name = "David", Age = 21, Grade = "C" }, + new Student { Name = "Damon", Age = 28, Grade = "B" }, + new Student { Name = "Echo", Age = 18, Grade = "C" } +}; + +// 使用WHERE筛选出成绩为A的学生 +var result1 = students.Where(student => student.Grade = "A"); + +// 使用WHERE筛选出年龄大于20的学生 +var result2 = students.Where(student => student.Age > 20); + +// 使用WHERE筛选出名字包含'D'的学生 +var result3 = students.Where(student => student.Name.Contains("D")); + +// 使用WHERE筛选出名字为'Bob'和'Echo'的学生 +List nameList = new() { "Bob", "Echo" }; +var result4 = students.Where(student => nameList.Contains(student.Name)); +``` + + + +### GROUPBY + +> 分组查询 + +```cs +// 示例数据源 +List students = new List +{ + new Student { Name = "Alice", Age = 25, Grade = "A" }, + new Student { Name = "Bob", Age = 30, Grade = "B" }, + new Student { Name = "Barry", Age = 35, Grade = "C" }, + new Student { Name = "Charlie", Age = 22, Grade = "A" }, + new Student { Name = "David", Age = 21, Grade = "C" }, + new Student { Name = "Damon", Age = 28, Grade = "B" }, + new Student { Name = "Echo", Age = 18, Grade = "C" } +}; + +// 使用GROUP BY按成绩进行分组查询 +var groupedByGrade = students.GroupBy(student => student.Grade); +``` + + + + + +### SELECT + + + +> 结果查询 + +```cs +// 示例数据源 +List students = new List +{ + new Student { Name = "Alice", Age = 25, Grade = "A" }, + new Student { Name = "Bob", Age = 30, Grade = "B" }, + new Student { Name = "Barry", Age = 35, Grade = "C" }, + new Student { Name = "Charlie", Age = 22, Grade = "A" }, + new Student { Name = "David", Age = 21, Grade = "C" }, + new Student { Name = "Damon", Age = 28, Grade = "B" }, + new Student { Name = "Echo", Age = 18, Grade = "C" } +}; + +// 使用SELECT创建一个新的匿名类,并输出为集合,一般配合Where使用 +var result1 = students.Select(student => + new + { + student.Name, + student.Age + }); + +// 使用SELECT创建一个新的指定类,并输出为集合 +var result2 = students.Select(student => new StudentDto() + { + StudentName = student.Name, + StudentAge = student.Age + }); +``` + + + +### ORDERBY + +> 排序 + +```cs +// 示例数据源 +List students = new List +{ + new Student { Name = "Alice", Age = 25, Grade = "A" }, + new Student { Name = "Bob", Age = 30, Grade = "B" }, + new Student { Name = "Barry", Age = 35, Grade = "C" }, + new Student { Name = "Charlie", Age = 22, Grade = "A" }, + new Student { Name = "David", Age = 21, Grade = "C" }, + new Student { Name = "Damon", Age = 28, Grade = "B" }, + new Student { Name = "Echo", Age = 18, Grade = "C" } +}; + +// 使用LINQ的OrderBy进行排序 +var result1 = students.OrderBy(student => student.Age); + +// 使用LINQ的OrderByDescending进行降序排序 +var result2 = students.OrderByDescending(student => student.Age); +``` + + + + + +### JOIN + + + +> `Join`:用于执行内连接操作,它会返回两个数据源中满足连接条件的元素的交集 +> +> `GroupJoin`:用于执行左外连接(left outer join)操作,它会返回左边数据源的所有元素,以及每个元素所匹配的右边数据源的元素组成的集合。(嵌套) + +```cs +// 示例数据源 +List departments = new List +{ + new Department { ID = 1, Name = "HR" }, + new Department { ID = 2, Name = "IT" } +}; +// 示例数据源 +List employees = new List +{ + new Employee { DepartmentID = 1, Name = "Alice" }, + new Employee { DepartmentID = 2, Name = "Bob" }, + new Employee { DepartmentID = 1, Name = "Charlie" }, + new Employee { DepartmentID = 3, Name = "David" } +}; + +// 使用Join,将部门和员工相结合,获取部门名称和员工名称的集合 +var joinQuery = departments.Join(employees, + department => department.ID, employee => employee.DepartmentID, + (department, employee) => new { Department = department.Name, Employee = employee.Name } + ); + +// 使用GroupJoin,将部门和员工相结合,返回所有的部门,并返回每个部门相关联的员工集合(嵌套) +var groupJoinQuery = departments.GroupJoin(employees, + department => department.ID, employee => employee.DepartmentID, + (department, employeeGroup) => new + { + Department = department.Name, + Employees = employeeGroup.Select(e => e.Name).ToList() + } + ); +``` + + + +### 结果转换 + + + +```cs +// ToList(): 将结果转换为List集合。 +List resultList = result.ToList(); + +// ToDictionary(): 将结果转换为Dictionary字典。 +Dictionary resultDictionary = students + .ToDictionary(student => student.Name, student => student.Age); + +// ToArray(): 将结果转换为数组。 +Student[] resultArray = result.ToArray(); + +// First(): 获取结果中的第一个元素。 +Student firstStudent = result.First(); + +// FirstOrDefault(): 获取结果中的第一个元素,如果结果为空则返回默认值。 +Student firstStudent = result.FirstOrDefault(); +``` + + + +### 自定义扩展方法 + +```cs +public static class CustomExtensions +{ + public static IEnumerable CustomFilter(this IEnumerable source, Func predicate) + { + foreach (var item in source) + { + if (predicate(item)) + { + yield return item; + } + } + } +} +// 使用自定义扩展方法 +var filteredData = students.CustomFilter(s => s.Age > 20); +``` + + + +### 示例 + + + +> 假设有一个包含学生信息的列表,每个学生有姓名、年龄和成绩。使用LINQ查询来选择年龄大于20岁的学生,然后按照他们的成绩进行分组,并选择每个分组中年龄最小的学生的姓名。 + +```cs +// 示例数据源 +List students = new List +{ + new Student { Name = "Alice", Age = 25, Grade = "A" }, + new Student { Name = "Bob", Age = 30, Grade = "B" }, + new Student { Name = "Barry", Age = 35, Grade = "C" }, + new Student { Name = "Charlie", Age = 22, Grade = "A" }, + new Student { Name = "David", Age = 21, Grade = "C" }, + new Student { Name = "Damon", Age = 28, Grade = "B" }, + new Student { Name = "Echo", Age = 18, Grade = "C" } +}; + +// 使用LINQ进行查询 +var result = students + .Where(student => student.Age > 20) // WHERE: 选择年龄大于20的学生 + .GroupBy(student => student.Grade) // GROUP BY: 按成绩分组 + .Select(group => group.OrderBy(student => student.Age).First().Name) // SELECT: 选择每个分组中年龄最小的学生的姓名 + .ToList(); //转换为List() + +//输出结果 +["Charlie","Damon","David"] +``` + 语法糖 ----