C#存储Excel读取动态数据的最优数据结构方案咨询
针对你需要存储动态结构的Excel工作表数据的需求,现有结构可以优化,也有更适配不同场景的可选方案,具体如下:
现有结构的潜在问题
你当前设计的自定义结构本身逻辑是通顺的,但存在一个容易踩坑的点:
- 自定义类
ItemType作为Dictionary的键时,默认是按引用匹配而非按属性值匹配,如果创建了两个属性完全一致但内存地址不同的ItemType实例,会被判定为两个不同的键,导致存取异常。
优化方案
方案1:优化现有自定义结构(适合需要强类型自定义扩展的场景)
C# 9及以上版本可以直接用record类型替代普通类,自动实现值比较逻辑,无需手动重写Equals和GetHashCode,同时可以将List<Property>替换为字典,提升属性查询效率:
// 用record定义,自动按属性值判等 public record ItemType(string Name, string Action); // 存储结构优化,内层用属性名做键,直接取值不用遍历List Dictionary<ItemType, Dictionary<string, List<string>>> data;
如果使用低于C#9的版本,手动给ItemType类重写Equals和GetHashCode方法即可。
方案2:使用原生DataSet+DataTable(适合需要做表格操作、对接数据库的场景)
.NET原生的System.Data.DataSet结构天生适配多工作表、动态列的表格存储需求:
- 每个
DataTable对应一个Excel工作表,TableName字段可以存工作表名称,也可以给DataTable扩展自定义属性存储ItemType的Action字段 - 动态添加
DataColumn对应工作表的不同属性,DataRow存储每行的属性值 - 原生支持筛选、排序、批量更新,甚至可以直接通过数据适配器批量写入数据库,无需自己实现数据操作逻辑
方案3:嵌套字典结构(适合轻量存储、需要序列化传输的场景)
如果不需要额外的自定义方法,仅做数据存储/传输,可以直接用轻量的嵌套字典结构,序列化JSON非常方便:
// 外层键为工作表名,也可以调整为ItemType作为键,内层每个元素对应一行数据,属性名到值的映射 Dictionary<string, List<Dictionary<string, object>>> data;
选型建议
- 如果你需要给存储的对象添加自定义业务方法,选优化后的自定义结构
- 如果你后续需要做表格数据的筛选、批量操作、对接数据库,直接选
DataSet方案,复用原生能力效率更高 - 如果你只是临时存储数据、需要快速序列化为JSON传输,选嵌套字典方案即可
内容的提问来源于stack exchange,提问作者Shruti Suresh
相关产品推荐
相关产品推荐

