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

如何将分组List转换为带动态行的DataTable?附示例代码

将分组Record列表转换为动态列DataTable的实现方案

嘿,这个需求我太熟悉了!咱们的目标是把按UserID分散的Record记录,转换成以UserID为行、FieldName为列的DataTable,每个单元格对应FieldValue。下面直接上实操步骤和代码:

核心思路

  1. 先从所有Record中提取唯一的FieldName,加上UserID一起作为DataTable的列;
  2. 按UserID对Record列表分组,每个用户的一组记录对应DataTable的一行;
  3. 把每个用户的FieldValue匹配到对应的列上,完成填充。

完整代码实现

using System.Data;
using System.Linq;

public static DataTable ConvertRecordsToDataTable(List<Record> records)
{
    // 1. 构建DataTable的列:UserID + 所有唯一的FieldName
    var dt = new DataTable();
    dt.Columns.Add("UserID", typeof(string));
    
    // 获取所有不重复的FieldName,避免重复列
    var uniqueFieldNames = records.Select(r => r.FieldName).Distinct();
    foreach (var fieldName in uniqueFieldNames)
    {
        dt.Columns.Add(fieldName, typeof(string));
    }

    // 2. 按UserID分组处理每个用户的记录
    var groupedRecords = records.GroupBy(r => r.UserID);
    foreach (var group in groupedRecords)
    {
        // 创建新行,先填充UserID
        DataRow row = dt.NewRow();
        row["UserID"] = group.Key;

        // 把当前用户的所有FieldValue映射到对应列
        foreach (var record in group)
        {
            row[record.FieldName] = record.FieldValue;
        }

        dt.Rows.Add(row);
    }

    return dt;
}

// 你的Record类(补全示例)
public class Record
{
    public string UserID { get; set; }
    public string FieldName { get; set; }
    public string FieldValue { get; set; }
}

关键点说明

  • 列的动态生成:用Distinct()确保每个FieldName只创建一列,避免重复;
  • 分组逻辑:GroupBy(r => r.UserID)把同一个用户的所有记录聚在一起,方便逐行填充;
  • 值的映射:遍历每个分组内的记录,直接用FieldName作为列名赋值,简单高效。

补充场景

如果遇到同一个UserID下重复的FieldName(比如同一个用户有两条"First Name"记录),可以根据需求调整:

  • 取第一条:group.First(r => r.FieldName == targetName).FieldValue
  • 合并值:string.Join(";", group.Where(r => r.FieldName == targetName).Select(r => r.FieldValue))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:45:50