C#实现数组动态列名:生成带动态分区名的学生班级数据集合
生成带动态分区名称的集合用于图表展示
首先咱们得明确核心问题:匿名类型的属性名是编译时确定的静态值,所以你没法直接把硬编码的"A"改成动态的"A (Commerce)"。要实现动态名称,咱们需要用支持动态属性的结构,比如Dictionary<string, object>或者ExpandoObject,下面给你两种实用的解决方案:
先修正模型的小笔误(可选)
看你的模型代码,MainModel里的属性是List<StudentStrenghtModel>,但你定义的类是StudentStrengthList,这应该是手滑打错了,建议统一类名保持一致:
public class MainModel { public List<StudentStrenghtModel> StudentStrengthList { get; set; } } public class StudentStrenghtModel { public string ClassName { get; set; } public int Sec1 { get; set; } // Section 'A' 人数 public int Sec2 { get; set; } // Section 'B' 人数 public int Sec3 { get; set; } // Section 'C' 人数 public int Sec4 { get; set; } // Section 'D' 人数 public int Sec5 { get; set; } // Section 'E' 人数 public int Total { get; set; } // 总人数 }
方案1:使用Dictionary<string, object>(推荐给图表组件)
大多数图表库都能直接解析字典的键值对,把键作为分区名称,值作为对应的数据。你可以先定义一个分区名称的映射表(可以从配置、数据库或其他地方动态获取),然后生成字典集合:
// 动态分区名称映射(可从配置/数据库加载,随时修改) var sectionNameMap = new Dictionary<int, string> { { 1, "A (Commerce)" }, { 2, "B (Science)" }, { 3, "C (Arts)" }, { 4, "D (Vocational)" }, { 5, "E (General)" } }; // 生成带动态名称的集合 var result = model.StudentStrengthList.Select(r => { var chartItem = new Dictionary<string, object> { // 保留原来的ClassName格式 ["ClassName"] = $"{r.ClassName} ({r.Total})" }; // 动态添加分区名称和对应人数 chartItem.Add(sectionNameMap[1], r.Sec1); chartItem.Add(sectionNameMap[2], r.Sec2); chartItem.Add(sectionNameMap[3], r.Sec3); chartItem.Add(sectionNameMap[4], r.Sec4); chartItem.Add(sectionNameMap[5], r.Sec5); return chartItem; }).ToList();
方案2:使用ExpandoObject(更接近对象语法)
如果你希望保留类似匿名类型的对象访问方式,可以用ExpandoObject,它允许在运行时动态添加属性:
var sectionNameMap = new Dictionary<int, string> { { 1, "A (Commerce)" }, { 2, "B (Science)" }, { 3, "C (Arts)" }, { 4, "D (Vocational)" }, { 5, "E (General)" } }; var result = model.StudentStrengthList.Select(r => { dynamic chartItem = new ExpandoObject(); // 设置固定属性 chartItem.ClassName = $"{r.ClassName} ({r.Total})"; // 把ExpandoObject转成字典来动态添加属性 var expandoDict = (IDictionary<string, object>)chartItem; expandoDict.Add(sectionNameMap[1], r.Sec1); expandoDict.Add(sectionNameMap[2], r.Sec2); expandoDict.Add(sectionNameMap[3], r.Sec3); expandoDict.Add(sectionNameMap[4], r.Sec4); expandoDict.Add(sectionNameMap[5], r.Sec5); return chartItem; }).ToList();
后续扩展提示
如果以后需要增加更多分区(比如Sec6),只需要在sectionNameMap里添加对应的条目,再在Select逻辑里加一行属性添加代码就行,不用修改核心逻辑,非常灵活。
内容的提问来源于stack exchange,提问作者Shailendra Kumar
相关产品推荐
相关产品推荐

