我需要删除包含string notUsed
或string 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#理解的方式形成该方法。
答案 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();