我目前有DataTable以下列:日期,X1,Y1,Z1,X2,Y2,Z2 ...... Xn,Yn,Zn.
填充时,Date ALWAYS有一个值,X/Y/Z1到X/Y/Zn可以是DBNull,a string或a int.如果除了Date之外的整行是DBNull,我想删除该特定行.
我目前正在进行详尽的搜索,使用for循环遍历每一行,然后使用嵌套for循环,检查每个单元格,如果我没有找到任何数据(即只有dbnull的),我然后调用RemoveAt,并重置外循环再次从零开始.
是否有更好/更少的hacky方式来执行此操作?无法修改数据表的初始构建,这必须是构建后发生的事情.
如果我理解正确,您希望删除所有列的行DbNull.Value.请尝试以下操作.
DataTable table = new DataTable();
string[] columns = table.Columns.Cast<DataColumn>()
.Select(x => x.ColumnName)
.Skip(1)//skip to ignore first column
.ToArray();
Run Code Online (Sandbox Code Playgroud)
方法1: 删除所有无效的行
var invalidRows = table.AsEnumerable()
.Where(x => columns.All(c => x.Field<object>(c) == DBNull.Value))
.ToArray();
foreach (var row in invalidRows)
{
table.Rows.Remove(row);
}
Run Code Online (Sandbox Code Playgroud)
方法2:只获取有效行并DataTable在注释中按照我的@Tim建议新建,以便在有许多无效行时提高性能
var newTable = table.AsEnumerable()
.Where(x => columns.Any(c => x.Field<object>(c) != DBNull.Value))
.CopyToDataTable();
Run Code Online (Sandbox Code Playgroud)