从数据表中删除行
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
}
但是我收到一条错误消息
"Additional information: This row has been removed from a table and
does not have any data. BeginEdit() will allow creation of new data
in this row.".
很多行可以有 "This Value" 或 "Other Value"。
==" " 值可以是很多不同的值,所以如果我这样做的话,将会有很多 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 ...");
它将return满足条件的行。请参阅此处的示例:
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();
我需要从 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
}
但是我收到一条错误消息
"Additional information: This row has been removed from a table and does not have any data. BeginEdit() will allow creation of new data in this row.".
很多行可以有 "This Value" 或 "Other Value"。
==" " 值可以是很多不同的值,所以如果我这样做的话,将会有很多 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 ...");
它将return满足条件的行。请参阅此处的示例: 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();