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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:32:57