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

如何动态转置WorkItemStateCalculatedTime列表对象?

问题与解决方案

问题说明

我有一个WorkItemStateCalculatedTime类型的列表:

public class WorkItemStateCalculatedTime
{
    public string State { get; set; }
    public double TimeinHrs { get; set; }
}

需要将该列表转置:把每个State的值作为列名,对应的TimeinHrs作为该列的取值(最终输出为一行数据,每个状态对应一列,值为对应耗时)。我尝试用dynamic列表实现,但未得到预期结果,测试代码如下:

List<dynamic> data = new List<dynamic>();
foreach (var item in workItemStateCalculatedTimes)
{
    data.Add(item.State);
}

解决方案

方法1:用ExpandoObject构建动态对象

适合生成单个动态对象,直接映射状态为属性、耗时为属性值的场景:

// workItemStateCalculatedTimes为你的源数据列表
var transposedObj = new ExpandoObject() as IDictionary<string, object>;

foreach (var item in workItemStateCalculatedTimes)
{
    // 若存在重复State,可根据需求改为累加:transposedObj[item.State] = (double)transposedObj.GetValueOrDefault(item.State, 0) + item.TimeinHrs
    transposedObj[item.State] = item.TimeinHrs;
}

// transposedObj即为转置后的动态对象,可直接用于数据绑定或输出

方法2:用DataTable实现表格转置

适合需要生成标准表格结构(导出、展示等场景):

DataTable transposedTable = new DataTable();

// 先添加所有不重复的State作为列
foreach (var state in workItemStateCalculatedTimes.Select(x => x.State).Distinct())
{
    transposedTable.Columns.Add(state, typeof(double));
}

// 添加行并填充对应列的值
DataRow row = transposedTable.NewRow();
foreach (var item in workItemStateCalculatedTimes)
{
    row[item.State] = item.TimeinHrs;
}
transposedTable.Rows.Add(row);

// transposedTable即为转置后的表格数据

原代码问题说明

你之前的代码只是将State字符串逐个添加到dynamic列表中,最终得到的是一个字符串集合,而非将State作为属性、TimeinHrs作为属性值的动态结构,因此无法实现转置需求。

内容的提问来源于stack exchange,提问作者Lifewithsun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:47:47