C# 筛选数据表的更好方法
我目前有一个C# 筛选数据表的更好方法,c#,datatable,C#,Datatable,我目前有一个数据表,包含以下列:日期、X1、Y1、Z1、X2、Y2、Z2。。。Xn,Yn,Zn 填充时,日期始终有一个值,X/Y/Z1到X/Y/Zn可以是DBNull、字符串或int。如果除Date之外的整行为DBNull,则我希望删除该特定行 我目前正在进行彻底的搜索,使用for循环遍历每一行,然后使用嵌套的for循环,检查每个单元格,如果没有找到任何数据(即只有dbnull),我将调用RemoveAt,并将外部循环重新设置为从零开始 是否有更好/更少的黑客方式来执行此操作?无法修改数据表的初
数据表
,包含以下列:日期、X1、Y1、Z1、X2、Y2、Z2。。。Xn,Yn,Zn
填充时,日期始终有一个值,X/Y/Z1到X/Y/Zn可以是DBNull
、字符串或int
。如果除Date之外的整行为DBNull,则我希望删除该特定行
我目前正在进行彻底的搜索,使用for循环遍历每一行,然后使用嵌套的for循环,检查每个单元格,如果没有找到任何数据(即只有dbnull),我将调用RemoveAt,并将外部循环重新设置为从零开始
是否有更好/更少的黑客方式来执行此操作?无法修改数据表的初始生成,这必须是生成后发生的情况。可能会对您有所帮助。试试这个
var ordered = yourdatatable.AsEnumerable().Where(x => x.Field<DateTime>("ColumnName") != null);
if (ordered.Count() > 0)
{
yourdatatable= orderedCopyToDataTable();
}
var ordered=yourdatatable.AsEnumerable()。其中(x=>x.Field(“ColumnName”)!=null);
if(ordered.Count()>0)
{
yourdatatable=orderedCopyToDataTable();
}
您也可以对其他列执行相同的操作
或
为什么不检查查询中的空值呢。检查是否有ISNULL(columnName,value)
作为columnName。查看更多详细信息,这可能会对您有所帮助。试试这个
var ordered = yourdatatable.AsEnumerable().Where(x => x.Field<DateTime>("ColumnName") != null);
if (ordered.Count() > 0)
{
yourdatatable= orderedCopyToDataTable();
}
var ordered=yourdatatable.AsEnumerable()。其中(x=>x.Field(“ColumnName”)!=null);
if(ordered.Count()>0)
{
yourdatatable=orderedCopyToDataTable();
}
您也可以对其他列执行相同的操作
或
为什么不检查查询中的空值呢。检查是否有ISNULL(columnName,value)
作为columnName。检查更多详细信息如果我理解正确,如果所有列都有DbNull.Value
,您希望删除一行。
请尝试下面的方法
DataTable table = new DataTable();
string[] columns = table.Columns.Cast<DataColumn>()
.Select(x => x.ColumnName)
.Skip(1)//skip to ignore first column
.ToArray();
如果我理解正确,那么如果所有列都有DbNull.Value
,则您希望删除一行。
请尝试下面的方法
DataTable table = new DataTable();
string[] columns = table.Columns.Cast<DataColumn>()
.Select(x => x.ColumnName)
.Skip(1)//skip to ignore first column
.ToArray();
注意:这些都是我的例子>>不能原谅您的表格>>>所以请自己更改它
主要帮助在这里>>
然后
方法一:
dtData.Select("ID=1 AND ID2=3");
方式二:
GridFieldDAO dao = new GridFieldDAO();
//Load My DataTable
DataTable dt = dao.getDT();
//Get My rows based off selection criteria
DataRow[] drs = dt.Select("(detailID = 1) AND (detailTypeID = 2)");
//make a new "results" datatable via clone to keep structure
DataTable dt2 = dt.Clone();
//Import the Rows
foreach (DataRow d in drs)
{
dt2.ImportRow(d);
}
//Bind to my new DataTable and it will only show rows based off selection
//criteria
myGrid.DataSource = dt2;
myGrid.DataBind();
最好的办法是:
DataTable tblFiltered = table.AsEnumerable()
.Where(row => row.Field<String>("Nachname") == username
&& row.Field<String>("Ort") == location)
.OrderByDescending(row => row.Field<String>("Nachname"))
.CopyToDataTable();
DataTable tblFiltered=table.AsEnumerable()
.Where(row=>row.Field(“Nachname”)==用户名
&&行字段(“Ort”)==位置)
.OrderByDescending(行=>row.Field(“Nachname”))
.CopyToDataTable();
注意:这些是我的示例>>不一定适合您的表格>>>所以请您自己更改
主要帮助在这里>>
然后
方法一:
dtData.Select("ID=1 AND ID2=3");
方式二:
GridFieldDAO dao = new GridFieldDAO();
//Load My DataTable
DataTable dt = dao.getDT();
//Get My rows based off selection criteria
DataRow[] drs = dt.Select("(detailID = 1) AND (detailTypeID = 2)");
//make a new "results" datatable via clone to keep structure
DataTable dt2 = dt.Clone();
//Import the Rows
foreach (DataRow d in drs)
{
dt2.ImportRow(d);
}
//Bind to my new DataTable and it will only show rows based off selection
//criteria
myGrid.DataSource = dt2;
myGrid.DataBind();
最好的办法是:
DataTable tblFiltered = table.AsEnumerable()
.Where(row => row.Field<String>("Nachname") == username
&& row.Field<String>("Ort") == location)
.OrderByDescending(row => row.Field<String>("Nachname"))
.CopyToDataTable();
DataTable tblFiltered=table.AsEnumerable()
.Where(row=>row.Field(“Nachname”)==用户名
&&行字段(“Ort”)==位置)
.OrderByDescending(行=>row.Field(“Nachname”))
.CopyToDataTable();
您可以使用这个小Linq查询:
var columnsWithoutDate = table.Columns.Cast<DataColumn>().Skip(1);
table = table.AsEnumerable()
.Where(row => columnsWithoutDate.Any(col => !row.IsNull(col)))
.CopyToDataTable();
var columnsWithoutDate=table.Columns.Cast().Skip(1);
table=table.AsEnumerable()
.Where(行=>列swithoutdate.Any(列=>!行.IsNull(列)))
.CopyToDataTable();
Skip(1)
返回除第一列以外的所有列,因此日期列被排除在外。Where
枚举表中的所有DataRows
,并获取至少有一个非空字段的所有行(请参阅:)。最后,CopyToDataTable
创建一个新的DataTable
您可以使用这个小Linq查询:
var columnsWithoutDate = table.Columns.Cast<DataColumn>().Skip(1);
table = table.AsEnumerable()
.Where(row => columnsWithoutDate.Any(col => !row.IsNull(col)))
.CopyToDataTable();
var columnsWithoutDate=table.Columns.Cast().Skip(1);
table=table.AsEnumerable()
.Where(行=>列swithoutdate.Any(列=>!行.IsNull(列)))
.CopyToDataTable();
Skip(1)
返回除第一列以外的所有列,因此日期列被排除在外。Where
枚举表中的所有DataRows
,并获取至少有一个非空字段的所有行(请参阅:)。最后,CopyToDataTable
创建一个新的DataTable
修改后的答案:
myDataTable.AsEnumerable().Where(a => a.ItemArray.Count(b=>b != DBNull.Value)==1).ToList().ForEach(row => dataTable.Rows.Remove(row));
我检查过了,它能用
编辑:
针对@Tim Schmelter的评论:
一,。您需要C语言中的myDataTable.AsEnumerable()#
如果您有一个强类型的数据表,那么您没有。我假设是这样的,因为OP说:
无法修改datatable的初始构建,这必须是
建筑后发生的事情
也许我不明白他的意思(我的英语有时会让我失望)
二,。计数非空字段不正确,因为字符串可以为空
这与DBNull.Value不同(也根据OP的
(规格)
你可能是对的。如果OP说他只想要DBNull,那么第二个条件应该被删除(我的坏习惯是为了以防万一而检查null)
三,。ToList创建另一个冗余列表
对。如果没有ToList(),则不能使用ForEach()。可以改用老式的foreach,也可以使用beterforloop(因为foreach不喜欢在其中修改集合)。但你还是要以某种方式保留你的结果
四,。DataRow.Delete不会从表中删除所需的内容,
但它将其标记为DataAdapter的已删除(OP没有提到
他正在使用一个,这也是不可取的)
谢谢你指出这一点。修改后的答案:
myDataTable.AsEnumerable().Where(a => a.ItemArray.Count(b=>b != DBNull.Value)==1).ToList().ForEach(row => dataTable.Rows.Remove(row));
我检查过了,它能用
编辑:
针对@Tim Schmelter的评论:
一,。您需要C语言中的myDataTable.AsEnumerable()#
如果您有一个强类型的数据表,那么您没有。我假设是这样的,因为OP说:
无法修改datatable的初始构建,这必须是
建筑后发生的事情
也许我不明白他的意思(我的英语有时会让我失望)
二,。计数非空字段不正确,因为字符串可以为空
这和我不一样