[英]Remove rows from a DataTable
我需要從列具有特定值的DataTable dt中刪除行。 在刪除它們之前,我將它們復制到另一個DataTable dt2nd。
看起來像這樣
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
DataRow row = dt.Rows[i];
if (row["Column2"].ToString() == "This Value")
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
}
if (row["Column2"].ToString() == "Other Value")
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
}
//This continues with more if
}
但是我收到一條錯誤消息
“附加信息:此行已從表中刪除,並且沒有任何數據.BeginEdit()將允許在此行中創建新數據。”
很多行可以具有“此值”或“其他值”。
==“”值可以是很多不同的值,所以如果我這樣做,那將是很多IF語句。
有沒有什么好方法可以用LINQ或其他方式做到這一點?
此代碼將起作用:
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
DataRow row = dt.Rows[i];
if (row["Column2"].ToString() == "This Value")
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
continue;
}
if (row["Column2"].ToString() == "Other Value")
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
continue;
}
//This continues with more if
}
或者您可以使用switch語句而不是所有ifs或使用else if
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
DataRow row = dt.Rows[i];
if (row["Column2"].ToString() == "This Value")
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
}
else if (row["Column2"].ToString() == "Other Value")
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
}
//This continues with more else if
}
要么
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
DataRow row = dt.Rows[i];
switch(row["Column2"].ToString()){
case "This Value":
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
break;
}
case "Other Value":
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
break;
}
//This continues with more case
}
但是,您也可以在數據表上使用select,並輸出需要移出的所有行。 這樣的事情:
dt.select("Column2 == 'This value' or ...");
它將返回滿足條件的行。 請參見此處的示例: http : //www.dotnetperls.com/datatable-select
但是如果操作總是相同的話,代碼可以縮短很多:
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
DataRow row = dt.Rows[i];
if (
(row["Column2"].ToString() == "This Value") ||
(row["Column2"].ToString() == "Other Value") //more checks
)
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
}
}
要么
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
DataRow row = dt.Rows[i];
switch(row["Column2"].ToString()){
case "This Value":
case "Other Value": //more case values
{
dt2nd.ImportRow(row); //Copy
dt.Rows.Remove(row); //Remove
break;
}
}
你可以嘗試這個......
var checkValues = new string[] { "Some value1", "Some value3" };
DataTable dt = new DataTable();
DataTable dt1 = new DataTable();
dt.Columns.Add("Column1");
dt.Columns.Add("Column2");
dt.Columns.Add("Column3");
dt.Rows.Add(new string[] {"Some value1", "Some value2", "Some value3" });
dt.AsEnumerable().ToList().ForEach(x =>
{
if (checkValues.Contains(x["Column1"]))
{
dt1.ImportRow(x);
dt.Rows.Remove(x);
}
});
var valuesToBeChecked = new String[] { "value1", "value2" };
var x = from y in dt.AsEnumerable()
where valuesToBeChecked.Any(t => valuesToBeChecked.Contains(y["Column2"].ToString()))
select y;
var z = dt.AsEnumerable().Except(x);
然后,您可以復制z
到datatable
你想要的:
DataTable dt2 = z.CopyToDataTable();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.