Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

เหตุใดจึงมีการแก้ไขการรวบรวมข้อผิดพลาด การดำเนินการแจงนับอาจไม่เกิดขึ้นและจะจัดการใน C # ได้อย่างไร


ข้อผิดพลาดนี้เกิดขึ้นเมื่อกำลังเรียกใช้กระบวนการวนซ้ำบนคอลเลกชัน (เช่น:รายการ) และคอลเลกชันถูกแก้ไข (เพิ่มหรือลบข้อมูล) ระหว่างรันไทม์

ตัวอย่าง

using System;
using System.Collections.Generic;
namespace DemoApplication {
   public class Program {
      static void Main(string[] args) {
         try {
            var studentsList = new List<Student> {
               new Student {
                  Id = 1,
                  Name = "John"
               },
               new Student {
                  Id = 0,
                  Name = "Jack"
               },
               new Student {
                  Id = 2,
                  Name = "Jack"
               }
            };
            foreach (var student in studentsList) {
               if (student.Id <= 0) {
                  studentsList.Remove(student);
               }
               else {
                  Console.WriteLine($"Id: {student.Id}, Name: {student.Name}");
               }
            }
         }
         catch(Exception ex) {
            Console.WriteLine($"Exception: {ex.Message}");
            Console.ReadLine();
         }
      }
   }
   public class Student {
      public int Id { get; set; }
      public string Name { get; set; }
   }
}

ผลลัพธ์

ผลลัพธ์ของโค้ดด้านบนคือ

Id: 1, Name: John
Exception: Collection was modified; enumeration operation may not execute.

ในตัวอย่างข้างต้น ลูป foreach ถูกดำเนินการบนรายชื่อนักเรียน เมื่อรหัสนักเรียนเป็น 0 รายการจะถูกลบออกจากรายชื่อนักเรียน เนื่องจากการเปลี่ยนแปลงนี้ studentList จึงได้รับการแก้ไข (ปรับขนาด) และมีการโยนข้อยกเว้นระหว่างรันไทม์

แก้ไขปัญหาข้างต้น

เพื่อแก้ปัญหาข้างต้น ให้ดำเนินการ ToList() ในรายชื่อนักเรียนก่อนเริ่มการวนซ้ำแต่ละครั้ง

foreach (var student in studentsList.ToList())

ตัวอย่าง

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
namespace DemoApplication {
   public class Program {
      static void Main(string[] args) {
         var studentsList = new List<Student> {
            new Student {
               Id = 1,
               Name = "John"
            },
            new Student {
               Id = 0,
               Name = "Jack"
            },
            new Student {
               Id = 2,
               Name = "Jack"
            }
         };
         foreach (var student in studentsList.ToList()) {
            if (student.Id <= 0) {
               studentsList.Remove(student);
            }
            else {
               Console.WriteLine($"Id: {student.Id}, Name: {student.Name}");
            }
         }
         Console.ReadLine();
      }
   }
   public class Student {
      public int Id { get; set; }
      public string Name { get; set; }
   }
}

ผลลัพธ์ของโค้ดด้านบนคือ

ผลลัพธ์

Id: 1, Name: John
Id: 2, Name: Jack