简体   繁体   English

如何删除DataTable中的多行?

[英]How to delete multiple rows in a DataTable?

How can I delete specific DataRows within a loop of a DataTable rows which meet a custom condition -lets say the rows having an index of even number-?如何在满足自定义条件的 DataTable 行的循环中删除特定的 DataRows - 让我们说具有偶数索引的行 -? (Without using LINQ) (不使用LINQ)

Thanks谢谢

It depends on what you mean by 'delete'.这取决于您所说的“删除”是什么意思。

If you mean mark them as deleted , just call the Delete() method on each row as you visit it in your loop.如果您的意思是将它们标记为已删除,只需在循环中访问每一行时调用Delete()方法。 You then need to call AcceptChanges() on the data table to finalize the delete - presumably after you update your database (if one is involved).然后您需要在数据表上调用AcceptChanges()以完成删除 - 大概是在您更新数据库之后(如果涉及)。

foreach( DataRow row in someTable.Rows )
{
    if( /* your condition here */ )
        row.Delete();
}
someTable.AcceptChanges();

If you mean remove it from the DataTable, then you need to do so in two passes:如果您的意思是从 DataTable 中删除它,那么您需要分两遍执行此操作:

List<DataRow> rowsToDelete = new List<DataRow>();
foreach( DataRow row in someTable.Rows )
{
    if( /* your condition here */ )
    {
        rowsToDelete.Add( row );
    }
}

foreach( DataRow row in rowsToDelete )
{
    someTable.Rows.Remove( row );
}

It's worth pointing out that you can always use the first method to remove rows - since marking rows as Deleted and then accepting changes will automatically remove them from the table.值得指出的是,您始终可以使用第一种方法删除行 - 因为将行标记为Deleted ,然后接受更改将自动从表中删除它们。 But, sometimes it is more clear and efficient to simply remove the DataRow objects from the Rows collection.但是,有时从Rows集合中简单地删除DataRow对象会更加清晰和有效。

Try something like this example试试这个例子

DataTable table = new DataTable();
table.Columns.Add("Foo",typeof(int));
for (int i = 0; i < 10; i++)
    table.Rows.Add(i);

for (int i = table.Rows.Count -1; i >=0; i--)
{
    // sample removes all even foos
    if ((int)table.Rows[i]["Foo"] % 2 == 0)
        table.Rows.RemoveAt(i);
}

如果您想要比上面建议的更短的解决方案,请尝试遍历结果列表,并使用像sub(x)这样的lambda来删除每一行。

dt.Select("Column1 > 0").ToList.ForEach(Sub(x) dt.Rows.Remove(x))

The other way is另一种方式是

    DataRow[] DrArrCheck = DataTableName.Select("ID > 0");
    foreach(DataRow DrCheck in DrArrCheck)
    {
        DataTableName.Rows.Remove(DrCheck);
    }

To delete multiple rows (for instance 50,000 out of 100,000) it is much quicker to copy the database than to do either datatable.Rows.Remove(row) or row.Delete().要删除多行(例如 100,000 行中的 50,000 行),复制数据库比执行 datatable.Rows.Remove(row) 或 row.Delete() 要快得多。 For instance:例如:

DataRow[] rowsToKeep = datatable.Select("ID > 50000");
DataTable tempDataTable= rowsToKeep.CopyToDataTable;
dataTable.Clear();
dataTable.Merge(tempDataTable);
tempDataTable.Dispose();
 public static void DeleteRowsFromDataTable(DataTable dataTable, string columnName, string columnValue)
        {
            IEnumerable<DataRow> dataRows = (from t in dataTable.AsEnumerable()
                                             where t.Field<string>(columnName) == columnValue
                                             select t);
            foreach (DataRow row in dataRows)
                dataTable.Rows.Remove(row);
        }

I always used LBushkin's "two-phase" approach and I finally decided it was worth it to write a function for it:我总是使用 LBushkin 的“两阶段”方法,我最终决定为它编写一个函数是值得的:

    public delegate bool DataRowComparer(DataRow dr);

    public static void RemoveDataRows(DataTable table, DataRowComparer drc)
    {
        List<DataRow> RowsToRemove = new List<DataRow>();
        foreach (DataRow dr in table.Rows)
            if (drc(dr))
                RowsToRemove.Add(dr);
        foreach (DataRow dr in RowsToRemove)
            table.Rows.Remove(dr);
    }

And now I can delete rows with one line of code (for example):现在我可以用一行代码删除行(例如):

RemoveDataRows(dt, row => row["StringVal"].ToString() == "B" && (Int16)(row["NumberVal"]) >= 4);

In case this helps anyone...如果这有助于任何人...

(And any ways to further abbreviate are appreciated.) (任何进一步缩写的方法都值得赞赏。)

try iterating over the result of Select().尝试迭代 Select() 的结果。 This is pretty similar to other answers, but I find it the most direct这与其他答案非常相似,但我觉得它是最直接的

DataRow[] r = table.Select();
for (int i = 0; i < r.Length; i++)
{
    if (i % 2 == 0)
        r[i].Delete();
}

This is how I do it.我就是这样做的。

    for (int i = RowNumber.Count - 1; i >= 0; i--)
                        {
                            dt.Rows.RemoveAt(Int32.Parse(RowNumber[i]));
                        }

                        missingNotesGV.DataSource = dt;

                        missingNotesGV.DataBind();

Its important to do the for loop in reverse otherwise you get errors if you're removing rows at the end in addition to rows in other places.反向执行 for 循环很重要,否则如果除了其他地方的行之外,还删除末尾的行,则会出错。

This is how I did it when I ran into this issue.当我遇到这个问题时,我就是这样做的。

Dim index As Integer = 0
Dim count As Integer = resultsDT.Rows.Count - 1
For i As Integer = 0 To count
    If resultsDT.Rows(index).Item("something") = "something" Then                               
        resultsDT.Rows(index).Delete()
        resultsDT.AcceptChanges()
        index = index - 1
    End If
    index = index + 1
    i = i + 1
Next

try this尝试这个

foreach(DataRow oRow in YourDataTable.Rows)
{
  if ("Check You Condition")
   {
      YourDataTable.Rows.Remove(oRow);
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM