跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp LINQ 投影
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C# LINQ 投影}} '''C# LINQ 投影'''是 LINQ(Language Integrated Query)中的一个核心概念,它允许开发者从数据源中选择特定的属性或转换数据,生成一个新的结果集。投影操作通常通过 '''Select''' 和 '''SelectMany''' 方法实现,它们能够灵活地提取、重组或计算数据,而无需修改原始数据源。 == 介绍 == 在 LINQ 中,'''投影'''(Projection)指的是从一个集合中选择或转换数据,生成一个新的形式。例如,从一个包含学生对象的列表中提取学生的姓名,或计算一组数字的平方值。投影操作不会修改原始数据,而是返回一个新的序列。 === 主要方法 === * '''Select''':用于从数据源中选择单个属性或计算新值。 * '''SelectMany''':用于处理嵌套集合(如列表的列表),并将其“展平”为单一序列。 == Select 方法 == '''Select''' 是 LINQ 中最常用的投影方法,它接受一个 lambda 表达式作为参数,指定如何转换或提取数据。 === 基本语法 === <syntaxhighlight lang="csharp"> IEnumerable<TResult> result = collection.Select(element => transformation); </syntaxhighlight> === 示例 1:提取属性 === 假设有一个 '''Student''' 类,我们想从学生列表中提取所有学生的姓名: <syntaxhighlight lang="csharp"> class Student { public string Name { get; set; } public int Age { get; set; } } List<Student> students = new List<Student> { new Student { Name = "Alice", Age = 20 }, new Student { Name = "Bob", Age = 22 }, new Student { Name = "Charlie", Age = 21 } }; // 使用 Select 提取 Name 属性 IEnumerable<string> names = students.Select(s => s.Name); foreach (string name in names) { Console.WriteLine(name); } </syntaxhighlight> '''输出:''' <pre> Alice Bob Charlie </pre> === 示例 2:计算新值 === 我们可以使用 '''Select''' 对数据进行计算,例如计算每个数字的平方: <syntaxhighlight lang="csharp"> List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; IEnumerable<int> squares = numbers.Select(n => n * n); foreach (int square in squares) { Console.WriteLine(square); } </syntaxhighlight> '''输出:''' <pre> 1 4 9 16 25 </pre> == SelectMany 方法 == '''SelectMany''' 用于处理嵌套集合,例如一个列表中包含多个子列表,我们希望将所有子列表的元素合并成一个单一序列。 === 基本语法 === <syntaxhighlight lang="csharp"> IEnumerable<TResult> result = collection.SelectMany(element => nestedCollection); </syntaxhighlight> === 示例 3:展平嵌套列表 === 假设有一个包含多个课程列表的学生类,我们想获取所有课程名称: <syntaxhighlight lang="csharp"> class Student { public string Name { get; set; } public List<string> Courses { get; set; } } List<Student> students = new List<Student> { new Student { Name = "Alice", Courses = new List<string> { "Math", "Physics" } }, new Student { Name = "Bob", Courses = new List<string> { "Chemistry", "Biology" } } }; // 使用 SelectMany 展平所有课程 IEnumerable<string> allCourses = students.SelectMany(s => s.Courses); foreach (string course in allCourses) { Console.WriteLine(course); } </syntaxhighlight> '''输出:''' <pre> Math Physics Chemistry Biology </pre> === 示例 4:结合 Select 和 SelectMany === 我们可以进一步处理嵌套数据,例如获取每个学生及其课程: <syntaxhighlight lang="csharp"> var studentCourses = students.SelectMany( s => s.Courses, (student, course) => $"{student.Name} - {course}" ); foreach (var item in studentCourses) { Console.WriteLine(item); } </syntaxhighlight> '''输出:''' <pre> Alice - Math Alice - Physics Bob - Chemistry Bob - Biology </pre> == 实际应用场景 == LINQ 投影在以下场景中非常有用: 1. '''数据转换''':从数据库查询结果中提取特定字段。 2. '''API 响应处理''':过滤或重组 JSON 数据。 3. '''报表生成''':计算汇总数据或格式化输出。 === 案例:从员工数据中提取部门名称 === 假设有一个员工列表,每个员工属于某个部门,我们想获取所有不重复的部门名称: <syntaxhighlight lang="csharp"> class Employee { public string Name { get; set; } public string Department { get; set; } } List<Employee> employees = new List<Employee> { new Employee { Name = "John", Department = "HR" }, new Employee { Name = "Jane", Department = "IT" }, new Employee { Name = "Doe", Department = "HR" } }; // 使用 Select 和 Distinct 获取唯一部门 IEnumerable<string> departments = employees .Select(e => e.Department) .Distinct(); foreach (string dept in departments) { Console.WriteLine(dept); } </syntaxhighlight> '''输出:''' <pre> HR IT </pre> == 性能考虑 == * '''延迟执行''':LINQ 投影操作通常是延迟执行的,只有在迭代结果时才会计算。 * '''内存效率''':使用 '''Select''' 和 '''SelectMany''' 不会立即创建新集合,而是按需生成数据。 * '''优化查询''':在数据库查询(如 Entity Framework)中,投影可以减少数据传输量,仅获取所需字段。 == 总结 == * '''Select''' 用于提取或转换单个元素。 * '''SelectMany''' 用于处理嵌套集合并展平结果。 * 投影操作不会修改原始数据,而是生成新的序列。 * 在实际开发中,合理使用投影可以提高代码可读性和性能。 == 参见 == * [[C# LINQ 基础]] * [[C# Lambda 表达式]] * [[C# 集合操作]] {{C# LINQ 导航}} [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp LINQ]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:C
(
编辑
)