Saya memiliki kasus klasik mencoba menghapus item dari koleksi sambil menghitungnya dalam satu lingkaran:
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.
}
Pada awal iterasi setelah perubahan terjadi, an InvalidOperationException
dilemparkan, karena enumerator tidak suka ketika koleksi yang mendasarinya berubah.
Saya perlu melakukan perubahan pada koleksi saat melakukan iterasi. Ada banyak pola yang dapat digunakan untuk menghindari hal ini , tetapi tidak satupun dari pola tersebut memiliki solusi yang baik:
Jangan hapus di dalam loop ini, sebagai gantinya simpan "Hapus Daftar" terpisah, yang Anda proses setelah loop utama.
Ini biasanya merupakan solusi yang baik, tetapi dalam kasus saya, saya perlu item untuk segera pergi sebagai "menunggu" sampai setelah loop utama untuk benar-benar menghapus item mengubah aliran logika kode saya.
Daripada menghapus item, cukup setel bendera pada item dan tandai sebagai tidak aktif. Kemudian tambahkan fungsionalitas pola 1 untuk membersihkan daftar.
Ini akan berfungsi untuk semua kebutuhan saya, tetapi itu berarti bahwa banyak kode harus diubah untuk memeriksa bendera tidak aktif setiap kali item diakses. Ini terlalu banyak administrasi untuk saya sukai.
Entah bagaimana, gabungkan ide-ide pola 2 dalam kelas yang diturunkan dari
List<T>
. Superlist ini akan menangani flag tidak aktif, penghapusan objek setelah fakta dan juga tidak akan mengekspos item yang ditandai sebagai tidak aktif untuk konsumen pencacahan. Pada dasarnya, ini hanya merangkum semua ide dari pola 2 (dan selanjutnya pola 1).Apakah kelas seperti ini ada? Apakah ada yang punya kode untuk ini? Atau apakah ada cara yang lebih baik?
Saya telah diberi tahu bahwa mengakses
myIntCollection.ToArray()
alih-alihmyIntCollection
akan menyelesaikan masalah dan memungkinkan saya menghapus di dalam loop.Ini sepertinya pola desain yang buruk bagi saya, atau mungkin tidak masalah?
Rincian:
Daftar akan berisi banyak item dan saya hanya akan menghapus beberapa dari mereka.
Di dalam loop, saya akan melakukan semua jenis proses, menambahkan, menghapus, dll., Jadi solusinya harus cukup umum.
Item yang perlu saya hapus mungkin bukan item saat ini dalam loop. Misalnya, saya mungkin berada di item 10 dari loop 30 item dan perlu menghapus item 6 atau item 26. Berjalan mundur melalui array tidak akan berfungsi lagi karena ini. ;Hai(