如何用C# Lambda替代循环将DataTable列值存入数组?
用Lambda表达式将DataTable列值转为数组
Hey Bill, 我懂你想摆脱循环、用Lambda实现需求的心情,这就给你捋清楚!
其实用LINQ结合Lambda就能轻松搞定,核心思路就是把DataTable转成可枚举的行集合,提取目标列的值后直接转成数组。这里分几种常见场景给你举例:
1. 提取字符串类型的列值
假设你的DataTable叫dt,目标列名为"TargetColumn",代码可以这么写:
string[] columnValues = dt.AsEnumerable() .Select(row => row["TargetColumn"].ToString()) .ToArray();
2. 提取数值类型(比如int)的列值
如果列是整数类型,记得做类型转换避免装箱拆箱:
int[] columnValues = dt.AsEnumerable() .Select(row => Convert.ToInt32(row["TargetColumn"])) .ToArray();
简单拆解每一步:
dt.AsEnumerable():把DataTable转换成IEnumerable<DataRow>,这样就能用LINQ的链式方法了Select(row => row["TargetColumn"].XXX):用Lambda遍历每一行,提取指定列的值并转换成你需要的类型.ToArray():把最终的枚举集合直接转成数组,一步替代显式循环
要是你原来的循环写法是这样的:
List<string> valuesList = new List<string>(); foreach(DataRow row in dt.Rows) { valuesList.Add(row["TargetColumn"].ToString()); } string[] columnValues = valuesList.ToArray();
那上面的Lambda写法就是把整个流程浓缩成了链式调用,完全消除了显式循环,是不是清爽多了?
如果你的列可能存在DBNull的情况,还可以加个空值判断兜底:
string[] columnValues = dt.AsEnumerable() .Select(row => row["TargetColumn"] != DBNull.Value ? row["TargetColumn"].ToString() : string.Empty) .ToArray();
这样就覆盖大部分场景啦,希望对你的Lambda学习有帮助!
内容的提问来源于stack exchange,提问作者WDrago
相关产品推荐
相关产品推荐

