1 Temmuz 2020 Çarşamba

ArrayList Sınıfı

Remove Metodu
Şu kod yanlış. Bu kod Java'da ConcurrentModificationException'a sebep oluyor. Üzerinde dolaştığımız listeden bir şey silinemez.
foreach (Foo x in this.Foos)
{
  if (...)
  {
    this.Foos.Remove(x);
  }
}
Çözüm 1
Şöyle yaparız. Sondan başlayıp başa doğru gideriz.
for (int i = this.Foos.Count - 1; i >= 0; i--)
{
  Foo x = this.Foos[i];
  if (...)
  {
    this.Foos.Remove(x);
  }
}
Çözüm 2
Şöyle yaparız. Silinecek nesneler ayrı bir listede toplanır. Daha sonra silinirler.
List<Foo> toBeRemoved = this.Foos.OfType<Foo>()
  .Where(x => ...).ToList();
toBeRemoved.ForEach(x => { this.Foos.Remove(x); });
Çözüm 3
Şöyle yaparız. ToList() ile yeni bir liste yaratılır. Bu liste üzerinde dolaşırken, orijinal listeden silme yapılabilir.
foreach (Foo x in this.Foos.OfType<Foo>().ToList())
{
  if (...)
  {
    this.Foos.Remove(x);
  }
}

Hiç yorum yok:

Yorum Gönder