当前位置: 首页 > news >正文

C#索引器练习题

索引器是一种特殊的属性,允许类或结构的实例像数组一样通过索引进行访问。它提供了使用[]运算符访问对象中元素集合的便捷方式。

一、考察索引器的定义与使用 难度:⭐

定义一个StudentClass班级类,该类中包含一个集合用于存储学生姓名。要求实现索引器,使得可以通过学号(从1开始编号)来访问和修改对应的学生姓名。

具体要求

  1. 类的成员

    • 一个私有集合(可以使用List<string>ArrayList)存储学生姓名

    • 一个私有字段classSize记录班级人数

  2. 构造函数

    • 接受一个整数参数size,表示班级人数

    • 初始化集合,并将所有学生姓名初始化为空字符串"""未分配"

  3. 索引器

    • 参数为int studentId(学号,从1开始)

    • get:返回指定学号的学生姓名,如果学号无效则返回"学号无效"

    • set:设置指定学号的学生姓名,如果学号无效则不进行任何操作(或抛出异常)

using System; using System.Collections.Generic; public class StudentClass { private List<string> students; // 存储学生姓名的集合 private int classSize; // 班级人数 // 构造函数 public StudentClass(int size) { if (size <= 0) throw new ArgumentException("班级人数必须大于0"); classSize = size; students = new List<string>(size); // 初始化集合,填充空字符串 for (int i = 0; i < size; i++) { students.Add("未分配"); } } // 索引器 public string this[int studentId] { get { // 检查学号是否有效(1 到 classSize) if (studentId >= 1 && studentId <= classSize) { return students[studentId - 1]; // 转换为0基索引 } return "学号无效"; } set { // 检查学号是否有效 if (studentId >= 1 && studentId <= classSize) { students[studentId - 1] = value; } else { Console.WriteLine($"错误:学号 {studentId} 无效,有效范围为 1-{classSize}"); } } } } // 测试代码 class Program { static void Main() { // 创建有5个学生的班级 StudentClass myClass = new StudentClass(5); // 通过索引器设置学生姓名 myClass[1] = "张三"; myClass[2] = "李四"; myClass[3] = "王五"; // 通过索引器获取学生姓名 Console.WriteLine($"学号1: {myClass[1]}"); Console.WriteLine($"学号3: {myClass[3]}"); Console.WriteLine($"学号5: {myClass[5]}"); // 未分配 Console.WriteLine($"学号6: {myClass[6]}"); // 无效学号 // 修改学生姓名 myClass[2] = "李小四"; Console.WriteLine($"学号2: {myClass[2]}"); } }

二、考察索引器的重载 难度⭐⭐

定义一个Student类,包含三个属性:Id(学号)、Name(姓名)、Address(地址)。

再定义一个StudentManager类,该类内部使用集合(如List<Student>Dictionary)存储多个Student对象。要求为该集合定义两个重载的索引器

  1. 根据 Id(整数)查找:返回对应学生的地址

  2. 根据 Name(字符串)查找:返回对应学生的地址

具体要求

1. Student 类

  • 属性:int Idstring Namestring Address

  • 构造函数:初始化三个属性

  • 可选:重写ToString()方法方便输出

2. StudentManager 类

  • 私有集合:存储Student对象(使用List<Student>Dictionary<int, Student>

  • 索引器1:参数为int id,返回该学生的地址(string类型)

    • 如果找到返回地址

    • 如果未找到返回"未找到该学号的学生"

  • 索引器2:参数为string name,返回该学生的地址(string类型)

    • 如果找到返回地址

    • 如果未找到返回"未找到该姓名的学生"

    • 注意:如果有重名学生,返回第一个匹配的学生的地址

3. 额外要求

  • 提供AddStudent(Student student)方法添加学生

  • 提供RemoveStudent(int id)方法删除学生(可选)

  • 提供DisplayAllStudents()显示所有学生信息(可选)

基础要求的测试代码:

// 创建学生对象 Student s1 = new Student(1001, "张三", "北京市朝阳区"); Student s2 = new Student(1002, "李四", "上海市浦东新区"); Student s3 = new Student(1003, "王五", "广州市天河区"); Student s4 = new Student(1004, "张三", "深圳市南山区"); // 重名学生 // 创建管理器并添加学生 StudentManager manager = new StudentManager(); manager.AddStudent(s1); manager.AddStudent(s2); manager.AddStudent(s3); manager.AddStudent(s4); // 使用 Id 索引器查找地址 Console.WriteLine($"学号1001的学生地址:{manager[1001]}"); Console.WriteLine($"学号1002的学生地址:{manager[1002]}"); Console.WriteLine($"学号9999的学生地址:{manager[9999]}"); // 使用 Name 索引器查找地址 Console.WriteLine($"\n张三的地址:{manager["张三"]}"); Console.WriteLine($"李四的地址:{manager["李四"]}"); Console.WriteLine($"赵六的地址:{manager["赵六"]}"); // 显示所有学生 manager.DisplayAllStudents();

期望输出:

学号1001的学生地址:北京市朝阳区 学号1002的学生地址:上海市浦东新区 学号9999的学生地址:未找到该学号的学生 张三的地址:北京市朝阳区 李四的地址:上海市浦东新区 赵六的地址:未找到该姓名的学生 所有学生信息: 学号:1001, 姓名:张三, 地址:北京市朝阳区 学号:1002, 姓名:李四, 地址:上海市浦东新区 学号:1003, 姓名:王五, 地址:广州市天河区 学号:1004, 姓名:张三, 地址:深圳市南山区

完整参考代码:

using System; using System.Collections.Generic; // 1. Student 类 class Student { public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } public Student(int id, string name, string address) { Id = id; Name = name; Address = address; } public override string ToString() { return $"学号:{Id}, 姓名:{Name}, 地址:{Address}"; } } // 2. StudentManager 类 class StudentManager { private List<Student> students; // 使用 List 存储 public StudentManager() { students = new List<Student>(); } // 添加学生 public void AddStudent(Student student) { students.Add(student); Console.WriteLine($"已添加学生:{student.Name} (学号:{student.Id})"); } // 索引器1 - 根据 Id 查找地址 public string this[int id] { get { // 方法1:使用 foreach 遍历 foreach (Student stu in students) { if (stu.Id == id) { return stu.Address; } } return "未找到该学号的学生"; /* 方法2:使用 Find 方法 Student found = students.Find(s => s.Id == id); return found != null ? found.Address : "未找到该学号的学生"; */ } } // 索引器2 - 根据 Name 查找地址 public string this[string name] { get { // 查找第一个匹配的学生 foreach (Student stu in students) { if (stu.Name == name) { return stu.Address; } } return "未找到该姓名的学生"; /* 方法2:使用 Find 方法 Student found = students.Find(s => s.Name == name); return found != null ? found.Address : "未找到该姓名的学生"; */ } } // 删除学生(可选) public bool RemoveStudent(int id) { Student student = students.Find(s => s.Id == id); if (student != null) { students.Remove(student); Console.WriteLine($"已删除学生:{student.Name} (学号:{id})"); return true; } Console.WriteLine($"未找到学号为 {id} 的学生,删除失败"); return false; } // 显示所有学生 public void DisplayAllStudents() { if (students.Count == 0) { Console.WriteLine("暂无学生信息"); return; } Console.WriteLine("\n所有学生信息:"); foreach (Student stu in students) { Console.WriteLine(stu); } Console.WriteLine(); } } // 3. 测试代码 class Program { static void Main() { // 创建学生对象 Student s1 = new Student(1001, "张三", "北京市朝阳区"); Student s2 = new Student(1002, "李四", "上海市浦东新区"); Student s3 = new Student(1003, "王五", "广州市天河区"); Student s4 = new Student(1004, "张三", "深圳市南山区"); // 重名 // 创建管理器并添加学生 StudentManager manager = new StudentManager(); manager.AddStudent(s1); manager.AddStudent(s2); manager.AddStudent(s3); manager.AddStudent(s4); Console.WriteLine("\n========== 测试 Id 索引器 =========="); // 使用 Id 索引器查找地址 Console.WriteLine($"学号1001的学生地址:{manager[1001]}"); Console.WriteLine($"学号1002的学生地址:{manager[1002]}"); Console.WriteLine($"学号1003的学生地址:{manager[1003]}"); Console.WriteLine($"学号1004的学生地址:{manager[1004]}"); Console.WriteLine($"学号9999的学生地址:{manager[9999]}"); Console.WriteLine("\n========== 测试 Name 索引器 =========="); // 使用 Name 索引器查找地址 Console.WriteLine($"张三的地址:{manager["张三"]}"); Console.WriteLine($"李四的地址:{manager["李四"]}"); Console.WriteLine($"王五的地址:{manager["王五"]}"); Console.WriteLine($"赵六的地址:{manager["赵六"]}"); // 显示所有学生 manager.DisplayAllStudents(); // 测试删除功能(可选) Console.WriteLine("\n========== 测试删除功能 =========="); manager.RemoveStudent(1002); manager.DisplayAllStudents(); // 测试删除后再次查找 Console.WriteLine($"删除后查询李四的地址:{manager["李四"]}"); } }

思考:索引器中的索引在集合中是重复的会怎样,比如根据学生姓名找学生地址,如果集合中有两个学生的姓名是相同的呢?

http://www.jsqmd.com/news/626449/

相关文章:

  • 3步拯救你的B站缓存视频:m4s-converter零配置转换方案
  • 系统找不到 allure 这个命令
  • 从零实现强化学习控制倒立摆:DQN变体对比与参数调优实战
  • AI模型与代码协同灰度发布实战指南(附金融级灰度决策矩阵V2.3)
  • SmartRC-CC1101驱动库:工业级ASK/OOK射频通信嵌入式HAL设计
  • AI模型签名+SBOM+运行时策略绑定:SITS2026现场演示12分钟构建合规可信AI交付单元
  • MFRC522_fix库深度解析:工业级RFID嵌入式驱动原理与实践
  • Snowflake Join reorder连接重排序优化揭秘
  • TP4351B 1A同步移动电源方案
  • STM32 CAN总线设置多个滤波器
  • 终极指南:如何用VR-Reversal免费将3D视频转为2D播放
  • 郭老师-情绪稳定:一个人最顶级的修养
  • Serilog:从结构化日志认知到 .NET 工程落地嗡
  • 【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---HITL(Human In The Loop)萄
  • 效率神器!命令行终端优化(Zsh, iTerm2)
  • 2026奇点智能技术大会前瞻(AI×Blockchain融合白皮书首曝)
  • 2026年番茄火锅底料厂家排行:调味品品牌推荐/调味料厂家/调味料品牌推荐/调味料研发厂家/钵钵鸡调料/餐调味料/选择指南 - 优质品牌商家
  • ARM 架构 JuiceFS 性能优化:基于 MLPerf 的实践与调优绕
  • 总结 TypedDict、Pydantic、Field、Annotated、Optional 等 Python 类型与校验工具的核心写法与组合方式
  • 手把手教你用TRAE+GPT5打造高效番茄计时器(附完整代码)
  • CISSP域3知识点 安全工程基础
  • StarWayDI:工业数据寻优新利器
  • AI原生DevSecOps实施路径图(2026企业级验证版):从PoC失败率73%到SLO达标率98.6%的跃迁
  • Python量化投资第一步:用baostock轻松获取A股历史数据(附完整代码)
  • 保姆级教程:用PaLI-X和PaLM-E微调你自己的RT-2风格机器人模型(附避坑指南)
  • 2026届必备的六大AI科研助手解析与推荐
  • 嵌入式TFT驱动库:16MHz SPI与屏幕翻转协同优化
  • CentOS 7.6服务器上,用FileZilla搞定VOS3000 8.0安装与授权(附详细命令)
  • 基于 TMS320F28335 的 EPWM 模块移相控制技术研究
  • 打造沉浸式智能AI问答助手:Vue + UniApp 全端实战(支持 Markdown/公式/多模态交互)姑