跟着AI学习C# Day12

📅 Day 12:LINQ(Language Integrated Query)基础

✅ 目标:

  • 理解 LINQ 的基本概念和作用;
  • 掌握使用 LINQ 查询集合(如 List<T>Array);
  • 学会使用常用 LINQ 方法:Where, Select, OrderBy, GroupBy, First, Any, Count 等;
  • 能够编写查询语句实现数据筛选、排序、投影等操作;
  • 编写一个简单的 LINQ 查询程序,例如学生信息查询系统。

🔍 什么是 LINQ?

LINQ(Language Integrated Query) 是 C# 中用于统一查询各种数据源(如数组、集合、数据库、XML 等)的语法。它将查询能力直接集成到 C# 语言中,使代码更简洁、可读性更强。

LINQ 支持两种查询语法:

  • 查询语法(Query Syntax):类似 SQL,结构清晰;
  • 方法语法(Method Syntax):使用 Lambda 表达式,功能强大灵活。

🧩 基本用法 & 示例

首先,确保你引入了命名空间:

csharp 复制代码
using System.Linq;

📋 示例准备:定义一个 Student 类并创建集合

csharp 复制代码
class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }
}

// 创建学生列表
List<Student> students = new List<Student>
{
    new Student { Id = 1, Name = "张三", Score = 85 },
    new Student { Id = 2, Name = "李四", Score = 92 },
    new Student { Id = 3, Name = "王五", Score = 78 },
    new Student { Id = 4, Name = "赵六", Score = 95 },
};

🧪 一、查询语法(Query Syntax)

💡 示例 1:查询所有成绩大于 90 的学生

csharp 复制代码
var highScorers = from student in students
                   where student.Score > 90
                   select student;

foreach (var s in highScorers)
{
    Console.WriteLine($"{s.Name} - 成绩:{s.Score}");
}

💡 示例 2:按成绩从高到低排序

csharp 复制代码
var sortedStudents = from student in students
                      orderby student.Score descending
                      select student;

foreach (var s in sortedStudents)
{
    Console.WriteLine($"{s.Name} - 成绩:{s.Score}");
}

💡 示例 3:投影查询(只取部分字段)

csharp 复制代码
var namesAndScores = from student in students
                      select new { student.Name, student.Score };

foreach (var item in namesAndScores)
{
    Console.WriteLine($"姓名:{item.Name},成绩:{item.Score}");
}

🧠 二、方法语法(Method Syntax)

方法语法结合 Lambda 表达式,更加灵活高效。

💡 示例 1:使用 Where 过滤数据

csharp 复制代码
var highScorers = students.Where(s => s.Score > 90);

foreach (var s in highScorers)
{
    Console.WriteLine($"{s.Name} - 成绩:{s.Score}");
}

💡 示例 2:使用 OrderByDescending 排序

csharp 复制代码
var sortedStudents = students.OrderByDescending(s => s.Score);

foreach (var s in sortedStudents)
{
    Console.WriteLine($"{s.Name} - 成绩:{s.Score}");
}

💡 示例 3:使用 Select 投影字段

csharp 复制代码
var names = students.Select(s => s.Name);

foreach (var name in names)
{
    Console.WriteLine(name);
}

💡 示例 4:使用 GroupBy 分组统计

csharp 复制代码
var grouped = students.GroupBy(s => s.Score / 10);  // 按分数段分组(如 70-79、80-89)

foreach (var group in grouped)
{
    Console.WriteLine($"分数段 {group.Key}0-{group.Key}9:");
    foreach (var s in group)
    {
        Console.WriteLine($"  {s.Name} - {s.Score}");
    }
}

🧩 三、常用 LINQ 方法汇总

方法名 描述
Where() 筛选符合条件的元素
Select() 投影转换,选择特定字段
OrderBy() 升序排序
OrderByDescending() 降序排序
GroupBy() 按某个条件分组
First() / FirstOrDefault() 获取第一个元素
Last() / LastOrDefault() 获取最后一个元素
Single() / SingleOrDefault() 获取唯一匹配的元素
Count() 统计元素数量
Any() 判断是否有符合条件的元素
All() 判断是否所有元素都满足条件

💪 实战练习

✅ 练习 1:学生信息查询系统

功能要求:
  • 输入一个最低分数,显示所有高于该分数的学生;
  • 显示成绩最高的学生;
  • 显示总人数和平均分。
csharp 复制代码
Console.Write("请输入最低分数:");
int minScore = int.Parse(Console.ReadLine());

var filtered = students.Where(s => s.Score >= minScore).ToList();

Console.WriteLine("\n符合条件的学生:");
foreach (var s in filtered)
{
    Console.WriteLine($"{s.Name} - {s.Score}");
}

// 最高分学生
var topStudent = students.OrderByDescending(s => s.Score).First();
Console.WriteLine($"\n最高分学生:{topStudent.Name} - {topStudent.Score}");

// 总人数和平均分
int count = students.Count();
double average = students.Average(s => s.Score);
Console.WriteLine($"总人数:{count},平均分:{average:F2}");

✅ 练习 2:判断是否存在及早退机制

csharp 复制代码
bool hasHighScorer = students.Any(s => s.Score > 95);
Console.WriteLine(hasHighScorer ? "存在高分学生" : "没有高分学生");

if (students.Any())
{
    var firstStudent = students.First();
    Console.WriteLine("第一个学生:" + firstStudent.Name);
}

📝 小结

今天你学会了:

  • LINQ 的基本概念及其优势;
  • 使用 查询语法方法语法 查询集合;
  • 掌握了常用的 LINQ 方法,如 Where, Select, OrderBy, GroupBy, First, Any, Count 等;
  • 实现了一个基于 LINQ 的学生信息查询系统。

LINQ 是 C# 中非常强大的工具,能够极大提升数据处理的效率与代码的可读性!


🧩 下一步学习方向(Day 13)

明天我们将进入一个新的主题 ------ 委托(Delegate)与事件(Event),它们是 C# 实现回调机制、事件驱动编程的核心。

相关推荐
莫逸雪1 小时前
Nodemo使用学习
学习·编辑器·vim
列星随旋3 小时前
线段树和树状数组的学习
学习·算法
辰海Coding4 小时前
MiniSpring框架学习-整合 IoC 和 MVC(NPC)
学习·spring·mvc
知识分享小能手6 小时前
Flask入门学习教程,从入门到精通,数据库操作 — 知识点详解与案例代码(4)
数据库·学习·flask
baivfhpwxf20237 小时前
c# 中对像之间频繁的转换会慢吗?
开发语言·c#
wubba lubba dub dub7507 小时前
第四十八周学习周报
学习
生成论实验室8 小时前
用事件关系网络重新理解AI(三):激活函数、微调与元学习
人工智能·学习·算法·语言模型·可信计算技术
辰海Coding8 小时前
MiniSpring框架学习-为什么一个请求访问 /helloworld,最后能调用到某个 Controller 方法?原始 MVC实现
java·学习·程序人生·spring·mvc
凉、介8 小时前
深入理解 ARMv7-A|异常/中断处理
笔记·学习·嵌入式·arm
默子昂8 小时前
用ai编写的一些小工具分享
windows·microsoft