如何在C#中实现书籍对象的ID系统及按ID查询功能?
实现书籍ID到对象的映射方案
你想实现的通过ID快速获取书籍对象的需求,用静态字典来管理ID和书籍对象的映射是最实用的方案,比手动定义大量静态属性靠谱多了,下面给你具体实现步骤:
- 第一步:定义Book实体类
public class Book { public int Id { get; set; } public string Title { get; set; } // 可扩展添加作者、出版社等其他属性 public Book(int id, string title) { Id = id; Title = title; } }
- 第二步:创建静态书籍管理器类
单独做管理器类职责更清晰,也可以直接把静态字典放到Book类里,看你代码结构偏好:
public static class BookManager { // 静态字典:键为书籍ID,值为对应Book对象 private static Dictionary<int, Book> _booksById = new Dictionary<int, Book>(); // 添加书籍到管理器的方法 public static void AddBook(Book book) { if (!_booksById.ContainsKey(book.Id)) { _booksById.Add(book.Id, book); } // 可根据需求添加重复ID的处理逻辑,比如抛出异常或覆盖旧数据 } // 根据ID获取书籍对象的方法 public static Book GetBookById(int id) { _booksById.TryGetValue(id, out Book book); return book; } }
- 第三步:对应你需求的使用示例
// 先初始化一批书籍数据 BookManager.AddBook(new Book(1, "C# 入门指南")); BookManager.AddBook(new Book(2, "设计模式")); BookManager.AddBook(new Book(3, ".NET 实战")); // 读取用户输入的书籍ID Console.Write("What ID is the book "); int tempId = Convert.ToInt32(Console.ReadLine()); // 根据ID获取书籍并输出标题 Book targetBook = BookManager.GetBookById(tempId); if (targetBook != null) { Console.WriteLine(targetBook.Title); } else { Console.WriteLine("未找到对应ID的书籍"); }
关于静态类属性的可行性说明
你之前考虑的静态类属性(比如public static Book Book1 { get; set; }这种)虽然能实现功能,但缺点很明显:
- 每新增一本新书都要手动添加对应的静态属性,扩展性极差;
- 无法动态处理运行时新增的书籍(比如从数据库、文件读取的书籍没法自动生成静态属性);
- 根据ID查找时需要写大量分支判断,代码冗余且维护成本高。
而静态字典的方式既支持初始化时添加数据,也能在运行时动态新增书籍,查找效率也更高(字典查找为O(1)时间复杂度),完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Solstice
相关产品推荐
相关产品推荐

