Dot-Net

如何在循環中從 Enumerable 集合中刪除對象

  • February 20, 2014

複製

在迭代時修改集合


有沒有人有一個很好的模式可以讓我在循環遍歷可列舉集合(例如,字典中的 IList 或 KeyValuePairs)時解決無法刪除對象的問題

例如,以下失敗,因為它修改了在 foreach 期間列舉的列表

foreach (MyObject myObject in MyListOfMyObjects)
{
    if (condition) MyListOfMyObjects.Remove(myObject);
}

過去我使用了兩種方法。

我已將 foreach 替換為反向 for 循環(以免在刪除對象時更改我正在循環的任何索引)。

我還嘗試儲存一個新的對象集合以在循環中刪除,然後遍歷該集合併從原始集合中刪除對象。

這些工作正常,但都感覺不好,我想知道是否有人想出了一個更優雅的解決方案

我認為有一個有用的List<T>.RemoveAll(Predicate<T> match)方法是為此設計的:http: //msdn.microsoft.com/en-us/library/wdka673a.aspx

這有點簡單,但是當我打算從 IEnumerable/IList 中刪除項目時,我通常只是複制一份:

foreach (MyObject myObject in new List<MyObject>(MyListOfMyObjects))
{
    if (condition) MyListOfMyObjects.Remove(myObject);
}

這不是最有效的方法,但它很容易閱讀。過早的優化等等。

引用自:https://stackoverflow.com/questions/404557