【问题标题】:Data Table + delete a row in c# using loop数据表+使用循环删除c#中的一行
【发布时间】:2011-03-10 04:15:09
【问题描述】:

我有一个数据表,我想删除一行这是我的代码,它抛出了一个异常

foreach (DataRow row in dt1.Rows)
{
    if ((row["Name"] == "Select a Lookbook") || (row["Name"] == "Create a new Lookbook"))
    {
        row.Delete();
        dt1.AcceptChanges();
    }
}

我什至在 if 语句之外尝试过,而在 forloop 之外仍然会抛出错误任何想法如何完成此任务这是我得到的异常:

Collection was modified; enumeration operation might not execute.

最终工作代码:

foreach (DataRow row in dt1.Select())
{
    if ((row["Name"] == "Select a Lookbook") ||    (row["Name"] == "Create a new Lookbook"))
    {
        row.Delete();                                       
    }

}

【问题讨论】:

标签: c# asp.net datatable


【解决方案1】:

当我遇到这个问题时,我就是这样做的。

            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

【讨论】:

    【解决方案2】:

    不要使用dt1.Rows,而是使用dt1.Select()

    这里的目标不是使用集合本身,而是使用不是Rows 集合的行数组

    【讨论】:

    • 完全按照我的意愿工作,谢谢
    【解决方案3】:

    在迭代 DataTable.Rows 时创建要删除的行列表,然后将它们单独删除。

    非 LINQ 解决方案:

    List<DataRow> rowsToDelete = new List<DataRow>();
    foreach (DataRow row in dt1.Rows)
    {
        if ((row["Name"] == "Select a Lookbook") || 
            (row["Name"] == "Create a new Lookbook"))
        {
            rowsToDelete.Add(row);
        }
    }
    foreach (DataRow row in rowsToDelete)
    {
        row.Delete();
    }
    dt1.AcceptChanges();
    

    LINQ 解决方案:

    List<DataRow> rowsToDelete = dt1.Rows.AsEnumerable()
        .Where(row => (row["Name"] == "Select a Lookbook") || 
                      (row["Name"] == "Create a new Lookbook"))
        .Tolist();
    foreach (DataRow row in rowsToDelete)
    {
        row.Delete();
    }
    dt1.AcceptChanges();
    

    【讨论】:

    • 我知道这是一个很好的答案,但我必须接受皮埃尔的回答,因为我相信它很容易做到。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2010-09-23
    • 2018-03-07
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多