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
相关产品推荐
相关产品推荐

