C#如何在内存中添加并存储多个对象 WPF项目模块信息存储实现方法
WPF项目内存存储模块信息最优实现方案
1. 先定义强类型模块实体类
首先创建Module类封装模块的所有属性,建议实现INotifyPropertyChanged接口适配WPF双向绑定需求,代码示例:
using System.ComponentModel; using System.Runtime.CompilerServices; public class Module : INotifyPropertyChanged { private string _moduleCode; public string ModuleCode { get => _moduleCode; set { _moduleCode = value; OnPropertyChanged(); } } private string _moduleName; public string ModuleName { get => _moduleName; set { _moduleName = value; OnPropertyChanged(); } } private decimal _credit; public decimal Credit { get => _credit; set { _credit = value; OnPropertyChanged(); } } private int _classHour; public int ClassHour { get => _classHour; set { _classHour = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 选择适配WPF的内存存储容器
优先使用ObservableCollection<Module>作为核心存储容器,优势如下:
- 泛型强类型设计,避免装箱拆箱开销和类型转换错误
- 内置实现
INotifyCollectionChanged接口,新增/删除/替换模块时会自动通知UI层更新,无需额外写集合变更通知逻辑
如果有频繁按模块代码查找的需求,可以额外搭配Dictionary<string, Module>做索引,key存储唯一的模块代码,增删数据时同步更新集合和字典,查询复杂度为O(1),性能远高于遍历集合。
3. 可选:封装统一管理类
如果项目模块操作逻辑复杂,可以封装单例的ModuleManager类统一维护所有模块数据,隔离业务逻辑和存储逻辑,示例如下:
public sealed class ModuleManager { private static readonly ModuleManager _instance = new ModuleManager(); public static ModuleManager Instance => _instance; public ObservableCollection<Module> Modules { get; } = new ObservableCollection<Module>(); private Dictionary<string, Module> _moduleIndex = new Dictionary<string, Module>(); private ModuleManager() { } public void AddModule(Module module) { if (module == null) throw new ArgumentNullException(nameof(module)); if (_moduleIndex.ContainsKey(module.ModuleCode)) throw new InvalidOperationException("模块代码不能重复"); Modules.Add(module); _moduleIndex.Add(module.ModuleCode, module); } public bool TryGetModule(string moduleCode, out Module module) { return _moduleIndex.TryGetValue(moduleCode, out module); } // 可按需扩展删除、修改、校验等方法 }
额外优化建议
- 可以将输入校验逻辑写在属性的setter或者
AddModule方法中,比如限制学分取值范围、学时必须为正整数,提前拦截非法数据 - 如果需要避免程序异常退出丢失录入数据,可以定期将内存数据序列化到本地JSON文件做临时备份,不需要的时候可以直接删除缓存文件
内容的提问来源于stack exchange,提问作者Sebastian Marshall
相关产品推荐
相关产品推荐

