通过同值关联另一DataTable更新多列的非Lambda实现方案
问题根因
List<T>.ForEach()方法仅接受1个Action<T>类型的入参,不支持传入多个独立Lambda表达式,因此原写法会直接触发编译错误。
可行实现(无任何Lambda表达式)
以下方案完全不使用Lambda,通过字典索引+传统循环实现多字段更新,性能优于原Linq Join写法,尤其适合数据量较大的场景:
// 第一步:构建源表datatable_B的name字段索引,加速匹配 Dictionary<string, DataRow> sourceMap = new Dictionary<string, DataRow>(); foreach (DataRow bRow in datatable_B.Rows) { string matchKey = bRow.Field<string>("name"); // 若业务中name为唯一键,可去掉重复判断直接覆盖/新增 if (!sourceMap.ContainsKey(matchKey)) { sourceMap.Add(matchKey, bRow); } } // 第二步:遍历目标表逐行匹配、更新多字段 foreach (DataRow aRow in datatable_A.Rows) { string matchKey = aRow.Field<string>("name"); if (sourceMap.TryGetValue(matchKey, out DataRow matchedBRow)) { aRow["phone number"] = matchedBRow["phone number"]; aRow["address"] = matchedBRow["address"]; aRow["nickname"] = matchedBRow["nickname"]; aRow["body weight"] = matchedBRow["body weight"]; } }
方案优势
- 全程使用传统循环、字典、DataRow原生索引器,无任何
=>形式的Lambda表达式,完全符合要求 - 字典索引将两表匹配的时间复杂度从嵌套遍历的O(n*m)降至O(n+m),数据量越大性能提升越明显
- 字段增减逻辑简单,后续需要新增同步字段时,仅需在匹配成功的代码块内新增一行赋值语句即可
- 内置重复键判断逻辑,可根据业务需求灵活调整(比如重复键取最后一条、抛出校验异常等)
内容的提问来源于stack exchange,提问作者Kay Lee
相关产品推荐
相关产品推荐

