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

C#按ID和Form分组DataTable并将图片路径存入数组的方案咨询

实现方案

前提说明

假设你的CaseDoc类定义如下(可根据实际业务调整字段类型,比如ID为整数则改为int):

public class CaseDoc
{
    public string ID { get; set; }
    public string Form { get; set; }
    public DateTime docDate { get; set; }
    public List<string> files { get; set; } // 用List比数组更灵活,如需数组可后续转换
}

方案一:LINQ分组(简洁高效)

核心是通过GroupBy按ID+Form的组合键分组,再将分组结果映射到CaseDoc对象。需注意同一分组内Date的取值逻辑(默认取组内第一条数据的Date,若分组内Date存在差异,可改为取最早/最晚值)。

// 假设XLSX数据已读取到DataTable dt中
var caseDocs = dt.AsEnumerable()
    .GroupBy(row => new 
    { 
        ID = row.Field<string>("ID"), 
        Form = row.Field<string>("Form") 
    })
    .Select(group => new CaseDoc
    {
        ID = group.Key.ID,
        Form = group.Key.Form,
        // 处理Date:若分组内Date统一,取第一条即可;若有差异,替换为Min/Max逻辑
        docDate = group.First().Field<DateTime>("Date"),
        // 收集所有ImagePath到files集合,可选过滤空路径
        files = group.Select(row => row.Field<string>("ImagePath"))
                     .Where(path => !string.IsNullOrEmpty(path))
                     .ToList()
    })
    .ToList();

常见问题处理

  • 若Date字段可能为空,改用可空类型处理:
    docDate = group.First().Field<DateTime?>("Date") ?? DateTime.MinValue;
    // 或根据业务需求设置合理默认值
    
  • 若需要files为数组,将.ToList()替换为.ToArray()即可。

方案二:循环遍历+字典分组(易调试)

如果LINQ的调试成本较高,用字典作为分组容器更直观,适合需要添加复杂业务逻辑的场景,9000行数据的性能完全够用。

var caseDocMap = new Dictionary<Tuple<string, string>, CaseDoc>();

foreach (DataRow row in dt.Rows)
{
    string id = row.Field<string>("ID");
    string form = row.Field<string>("Form");
    var groupKey = Tuple.Create(id, form);
    
    if (!caseDocMap.ContainsKey(groupKey))
    {
        // 首次遇到该分组,初始化CaseDoc对象
        caseDocMap[groupKey] = new CaseDoc
        {
            ID = id,
            Form = form,
            docDate = row.Field<DateTime>("Date"),
            files = new List<string>()
        };
    }
    
    // 添加图片路径,可选过滤空值
    string imagePath = row.Field<string>("ImagePath");
    if (!string.IsNullOrEmpty(imagePath))
    {
        caseDocMap[groupKey].files.Add(imagePath);
    }
}

// 最终结果转为List
var caseDocs = caseDocMap.Values.ToList();

性能提示

9000行属于小规模数据集,两种方案的性能差异可忽略。若后续数据量大幅增长,可优先选择循环方案(减少LINQ的委托调用开销),或提前过滤无效行(如空ID/Form)优化执行效率。

内容的提问来源于stack exchange,提问作者shhh-bacon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:00:31