gpt4 book ai didi

c# - 在 C# 中枚举时从 List 中删除项目的智能方法

转载 作者:IT王子 更新时间:2023-10-29 03:38:42 24 4
gpt4 key购买 nike

我有一个经典案例,即在循环中枚举时尝试从集合中删除一个项目:

List<int> myIntCollection = new List<int>();
myIntCollection.Add(42);
myIntCollection.Add(12);
myIntCollection.Add(96);
myIntCollection.Add(25);

foreach (int i in myIntCollection)
{
if (i == 42)
myIntCollection.Remove(96); // The error is here.
if (i == 25)
myIntCollection.Remove(42); // The error is here.
}

在发生更改后的迭代开始时,InvalidOperationException被抛出,因为枚举器不喜欢底层集合发生变化。

我需要在迭代时对集合进行更改。有许多模式可以用来避免这种情况,但似乎没有一个有很好的解决方案:

  1. 不要在此循环内删除,而是保留一个单独的“删除列表”,在主循环之后处理。

    这通常是一个很好的解决方案,但就我而言,我需要该项目立即消失,因为“等待”直到之后真正删除项目的主循环改变了我的代码的逻辑流程。

  2. 不是删除项目,而是简单地在项目上设置一个标志并将其标记为非事件状态。然后添加模式 1 的功能来清理列表。

    满足我的所有需求,但这意味着必须更改很多代码才能在每次项目被关闭时检查非事件标志访问过。我不喜欢这种管理方式。

  3. 以某种方式将模式 2 的思想合并到派生自 List<T> 的类中.这个 super 列表将处理非事件标志,事后删除对象,也不会向枚举消费者公开标记为非事件的项目。基本上,它只是封装了模式 2(以及随后的模式 1)的所有思想。

    是否存在这样的类?有人有这方面的代码吗?还是有更好的方法?

  4. 有人告诉我访问 myIntCollection.ToArray()而不是 myIntCollection将解决问题并允许我在循环内删除。

    这对我来说似乎是一个糟糕的设计模式,或者它可能没问题?

详细信息:

  • 该列表将包含许多项目,我将只删除其中的一部分。

  • 在循环内,我将进行各种处理,添加、删除等,因此解决方案需要相当通用。

  • 我需要删除的项目可能不是循环中的当前项目。例如,我可能在 30 项循环的第 10 项上,需要删除第 6 项或第 26 项。因此,向后遍历数组将不再有效。 ;o(

最佳答案

最好的解决方案通常是使用 RemoveAll()方法:

myList.RemoveAll(x => x.SomeProp == "SomeValue");

或者,如果您需要删除某些元素:

MyListType[] elems = new[] { elem1, elem2 };
myList.RemoveAll(x => elems.Contains(x));

当然,这假定您的循环仅用于删除目的。如果您确实需要额外的处理,那么最好的方法通常是使用forwhile 循环,因为那样您就不用一个枚举器:

for (int i = myList.Count - 1; i >= 0; i--)
{
// Do processing here, then...
if (shouldRemoveCondition)
{
myList.RemoveAt(i);
}
}

向后移动可确保您不会跳过任何元素。

对编辑的回应:

如果您要删除看似随意的元素,最简单的方法可能是只跟踪要删除的元素,然后一次将它们全部删除。像这样:

List<int> toRemove = new List<int>();
foreach (var elem in myList)
{
// Do some stuff

// Check for removal
if (needToRemoveAnElement)
{
toRemove.Add(elem);
}
}

// Remove everything here
myList.RemoveAll(x => toRemove.Contains(x));

关于c# - 在 C# 中枚举时从 List<T> 中删除项目的智能方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7193294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com