You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:09:03