检查DataRow单元格是否部分包含字符串

时间:2014-09-05 13:53:25

标签: c# foreach system.data

我需要删除包含string notUsedstring notUsed2的所有行,其中特定标识为2.

在将任何数据附加到stringbuilder之前,我正在使用foreach循环来实现此目的。

我会选择这样的方法:

foreach (DataRow dr in ds.Tables[0].Rows)
    {
        int auth = (int)dr[0];
        if (auth == 2) continue;
        string notUsed = "NO LONGER USED";
        string notUsed2 = "NO LONGER IN USE";

        if (dr.Cells[3].ToString().Contains(string)notUsed)
        {
            dr.Delete();
        }
        else
        {
            if (dr.Cells[3].ToString().Contains(string)notUsed2)
            {
                dr.Delete();
            }
        }
    }

但是,以上是......完全错了。这对我来说似乎合乎逻辑,但我不太明白如何以C#理解的方式形成该方法。

1 个答案:

答案 0 :(得分:1)

你应该

  • 删除Cells,因为它不是DataRow的属性而是使用 dr[3]
  • 从包含中移除string,以便您的支票应该像:if (dr[3].ToString().Contains(notUsed))
  • 您正在修改foreach循环内的集合,方法是删除该行。您应该使用for向后循环。

像:

for (int i = ds.Tables[0].Rows.Count - 1; i >= 0; i--)
{
    DataRow dr = ds.Tables[0].Rows[i];
    int auth = (int)dr[0];
    if (auth == 2) continue;
    string notUsed = "NO LONGER USED";
    string notUsed2 = "NO LONGER IN USE";

    if (dr[3].ToString().Contains(notUsed))
    {
        dr.Delete();
    }
    else
    {
        if (dr[3].ToString().Contains(notUsed2))
        {
            dr.Delete();
        }
    }
}

您还可以使用LINQ to DataSet 并获得新的DataTable

DataTable newDataTAble = ds.Tables[0].AsEnumerable()
                            .Where(r => !r.Field<string>(3).Contains(notUsed) &&
                                        r.Field<string>(3).Contains(notUsed2))
                            .CopyToDataTable();