Me gusta iterar hacia atrás usando un loop for
, pero esto puede ser tedioso en comparación con foreach
. Una solución que me gusta es crear un enumerador que atraviese la lista hacia atrás. Puede implementar esto como un método de extensión en ArrayList
o List<T>
. La implementación para ArrayList
está debajo.
public static IEnumerable GetRemoveSafeEnumerator(this ArrayList list)
{
for (int i = list.Count - 1; i >= 0; i--)
{
// Reset the value of i if it is invalid.
// This occurs when more than one item
// is removed from the list during the enumeration.
if (i >= list.Count)
{
if (list.Count == 0)
yield break;
i = list.Count - 1;
}
yield return list[i];
}
}
La implementación para List<T>
es similar.
public static IEnumerable<T> GetRemoveSafeEnumerator<T>(this List<T> list)
{
for (int i = list.Count - 1; i >= 0; i--)
{
// Reset the value of i if it is invalid.
// This occurs when more than one item
// is removed from the list during the enumeration.
if (i >= list.Count)
{
if (list.Count == 0)
yield break;
i = list.Count - 1;
}
yield return list[i];
}
}
El ejemplo siguiente utiliza el empadronador para eliminar todos los enteros pares de un ArrayList
.
ArrayList list = new ArrayList() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
foreach (int item in list.GetRemoveSafeEnumerator())
{
if (item % 2 == 0)
list.Remove(item);
}
Para el registro, a menos que esté utilizando .NET 1.0 o 1.1, es probable que debe utilizar '' Lista en lugar de 'ArrayList'. –
¿Por qué este duplicado obtengo este error ** a veces ** en 'Application.Exit();' y no manipulo ninguna colección ni aplicación. – Bitterblue
foreach (artículo ItemCollection en ItemCollection.Values) Para foreach (ItemCollection s en ItemCollection.Values.ToList()) La cuestión es que ItemCollection.Values se está modificando en el interior del bucle foreach. Llamar a ItemCollection.Values.ToList() copia los valores de los suscriptores. Valores en una lista separada al inicio de foreach –