ฉันมีกรณีคลาสสิกในการพยายามลบรายการออกจากคอลเลกชั่นในขณะที่ระบุเป็นวงรอบ:
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
List<T>
ในชั้นเรียนที่มาจาก ซูเปอร์ลิสต์นี้จะจัดการแฟล็กที่ไม่ใช้งานการลบอ็อบเจ็กต์หลังความจริงและจะไม่เปิดเผยรายการที่ทำเครื่องหมายว่าไม่ใช้งานต่อผู้บริโภคการแจงนับ โดยพื้นฐานแล้วมันจะสรุปความคิดทั้งหมดของรูปแบบ 2 (และรูปแบบที่ 1 ในภายหลัง)คลาสแบบนี้มีอยู่จริงหรือไม่? ใครมีรหัสสำหรับสิ่งนี้? หรือมีวิธีที่ดีกว่านี้?
ฉันได้รับแจ้งว่าการเข้าถึง
myIntCollection.ToArray()
แทนmyIntCollection
จะช่วยแก้ปัญหาและอนุญาตให้ฉันลบภายในลูปดูเหมือนว่าจะเป็นรูปแบบการออกแบบที่ไม่ดีสำหรับฉันหรืออาจจะดี?
รายละเอียด:
รายการจะมีหลายรายการและฉันจะลบเพียงบางรายการเท่านั้น
ภายในลูปฉันจะทำกระบวนการทุกประเภทเพิ่มลบ ฯลฯ ดังนั้นวิธีแก้ปัญหาจึงต้องค่อนข้างทั่วไป
รายการที่ฉันต้องการลบอาจไม่ใช่รายการปัจจุบันในลูป ตัวอย่างเช่นฉันอาจอยู่ในรายการ 10 จาก 30 รายการวนซ้ำและจำเป็นต้องลบรายการ 6 หรือรายการ 26 การเดินย้อนกลับไปตามอาร์เรย์จะไม่ทำงานอีกต่อไปเนื่องจากสิ่งนี้ ; o (