如何动态转置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
相关产品推荐
相关产品推荐

