过滤DataTable的更好方法

biz*_*dee 0 c# datatable

我目前有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方式来执行此操作?无法修改数据表的初始构建,这必须是构建后发生的事情.

Sri*_*vel 6

如果我理解正确,您希望删除所有列的行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)