0

我需要消除所有包含string notUsedor的行string notUsed2,其中特定标识为 2。

在将我的任何数据附加到字符串生成器之前,我正在使用 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# 理解的方式形成该方法。

4

1 回答 1

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();
于 2014-09-05T14:03:41.630 回答