簡體   English   中英

如何刪除DataTable中的多行?

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

如何在滿足自定義條件的 DataTable 行的循環中刪除特定的 DataRows - 讓我們說具有偶數索引的行 -? (不使用LINQ)

謝謝

這取決於您所說的“刪除”是什么意思。

如果您的意思是將它們標記為已刪除,只需在循環中訪問每一行時調用Delete()方法。 然后您需要在數據表上調用AcceptChanges()以完成刪除 - 大概是在您更新數據庫之后(如果涉及)。

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

如果您的意思是從 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 );
}

值得指出的是,您始終可以使用第一種方法刪除行 - 因為將行標記為Deleted ,然后接受更改將自動從表中刪除它們。 但是,有時從Rows集合中簡單地刪除DataRow對象會更加清晰和有效。

試試這個例子

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))

另一種方式是

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

要刪除多行(例如 100,000 行中的 50,000 行),復制數據庫比執行 datatable.Rows.Remove(row) 或 row.Delete() 要快得多。 例如:

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);
        }

我總是使用 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);
    }

現在我可以用一行代碼刪除行(例如):

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

如果這有助於任何人...

(任何進一步縮寫的方法都值得贊賞。)

嘗試迭代 Select() 的結果。 這與其他答案非常相似,但我覺得它是最直接的

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

我就是這樣做的。

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

                        missingNotesGV.DataSource = dt;

                        missingNotesGV.DataBind();

反向執行 for 循環很重要,否則如果除了其他地方的行之外,還刪除末尾的行,則會出錯。

當我遇到這個問題時,我就是這樣做的。

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

嘗試這個

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