C#中如何将DataTable指定行范围的数据复制到另一个DataTable
更优的DataTable行复制方案
嘿,你的现有实现逻辑其实已经很可靠了,但确实有几种更简洁甚至在代码可读性上更优的方案,我来给你拆解一下:
方案一:LINQ 查询(最简洁直观)
如果你用的是.NET 3.5及以上版本,直接用LINQ可以把代码压缩到几行,可读性拉满:
// 记得先引用 System.Linq 命名空间 DataTable dtNew = table.AsEnumerable() .Skip(30) // 跳过前30行(对应原表第1-30行) .Take(20) // 提取接下来的20行(对应原表第31-50行) .CopyToDataTable();
不过要注意一个小坑:如果筛选后没有任何行(比如原表实际行数不足30),CopyToDataTable()会抛出异常。可以加个前置判断避免这种情况:
var targetRows = table.AsEnumerable().Skip(30).Take(20); DataTable dtNew = targetRows.Any() ? targetRows.CopyToDataTable() : table.Clone();
方案二:保留原逻辑的优化版
如果你的项目环境不能用LINQ,或者更习惯原生循环写法,也可以给原代码做一点点优化:
- 提前计算循环的上限,避免每次循环都重复判断
k < table.Rows.Count - 把
table.Rows.Count缓存到变量里,减少属性访问次数
优化后的代码:
DataTable dtNew = table.Clone(); int maxRow = Math.Min(50, table.Rows.Count); for(int k = 30; k < maxRow; k++) { dtNew.ImportRow(table.Rows[k]); }
这个版本和你的原逻辑本质一样,但减少了循环内的判断次数,在数据量极大的时候能略微提升性能。
方案对比
- 你的原方案:兼容性最好,不需要额外依赖,适合所有.NET版本,逻辑清晰易懂
- LINQ方案:代码最简洁,可读性最强,但需要.NET 3.5+,且要处理空结果的异常情况
- 优化后的循环方案:和原方案兼容性一致,性能略优一点点
其实在数据量不大(比如你说的100行)的情况下,几种方案的性能差异几乎可以忽略,主要看你更看重代码简洁性还是兼容性~
内容的提问来源于stack exchange,提问作者Rama Krishna




