Bir öğeyi bir döngüde numaralandırırken bir koleksiyondan kaldırmaya çalışmak gibi klasik bir durum var:
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.
}
Bir değişiklik gerçekleştikten sonra yinelemenin başında bir InvalidOperationException
atılır, çünkü numaralandırıcılar temeldeki koleksiyonun değişmesinden hoşlanmaz.
Yineleme sırasında koleksiyonda değişiklik yapmam gerekiyor. Bundan kaçınmak için kullanılabilecek birçok model var , ancak hiçbirinin iyi bir çözümü yok gibi görünüyor:
Bu döngünün içini silmeyin, bunun yerine ana döngüden sonra işlediğiniz ayrı bir "Silme Listesi" tutun.
Bu normalde iyi bir çözümdür, ancak benim durumumda, öğeyi gerçekten silmek için ana döngüden kodumun mantık akışını değiştirene kadar öğenin anında "bekleyerek" gitmesine ihtiyacım var.
Öğeyi silmek yerine, öğe üzerinde bir bayrak ayarlayın ve onu devre dışı olarak işaretleyin. Ardından listeyi temizlemek için desen 1'in işlevselliğini ekleyin.
Bu , tüm ihtiyaçlarım için işe yarar, ancak bu, bir öğeye her erişildiğinde etkin olmayan bayrağı kontrol etmek için birçok kodun değiştirilmesi gerektiği anlamına gelir . Bu benim zevkime göre çok fazla idare.
Bir şekilde model 2'nin fikirlerini bir sınıfa dahil edin
List<T>
. Bu Süper Liste, etkin olmayan bayrağı, nesnelerin olaydan sonra silinmesini ele alacak ve ayrıca etkin olmayan olarak işaretlenen öğeleri numaralandırma tüketicilerine göstermeyecektir. Temel olarak, sadece 2. modelin (ve ardından 1. modelin) tüm fikirlerini kapsamaktadır.Bunun gibi bir sınıf var mı? Bunun için kodu olan var mı? Yoksa daha iyi bir yol var mı?
Bunun
myIntCollection.ToArray()
yerine erişiminmyIntCollection
sorunu çözeceği ve döngü içinde silmeme izin vereceği söylendi .Bu bana kötü bir tasarım kalıbı gibi geliyor, yoksa sorun olabilir mi?
Detaylar:
Liste birçok öğe içerecek ve sadece bazılarını kaldıracağım.
Döngünün içinde, her türlü işlemi yapıyor olacağım, ekleyeceğim, çıkaracağım, bu yüzden çözümün oldukça genel olması gerekiyor.
Silmem gereken öğe döngüdeki geçerli öğe olmayabilir . Örneğin, 30 maddelik bir döngünün 10. maddesinde olabilirim ve madde 6 ya da madde 26'yı kaldırmam gerekebilir. Bu nedenle, dizi içinde geriye doğru yürümek artık işe yaramayacak. ;Ö(