Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 筛选数据表的更好方法_C#_Datatable - Fatal编程技术网

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的初始构建,这必须是 建筑后发生的事情

也许我不明白他的意思(我的英语有时会让我失望)

二,。计数非空字段不正确,因为字符串可以为空 这和我不一样