Computer >> Máy Tính >  >> Lập trình >> C#

Tại sao Bộ sưu tập lỗi được sửa đổi; Thao tác liệt kê có thể không thực thi xảy ra và làm thế nào để xử lý nó trong C #?

Lỗi này xảy ra khi một quá trình lặp đang chạy trên một tập hợp (Ví dụ:Danh sách) và tập hợp được sửa đổi (thêm hoặc xóa dữ liệu) trong thời gian chạy.

Ví dụ

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; }
   }
}

Đầu ra

Đầu ra của đoạn mã trên là

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

Trong ví dụ trên, vòng lặp foreach được thực thi trên studentList. Khi Id của sinh viên bằng 0, mục này sẽ bị xóa khỏi Danh sách sinh viên. Do thay đổi này, Danh sách sinh viên được sửa đổi (thay đổi kích thước) và một ngoại lệ sẽ được đưa ra trong thời gian chạy.

Khắc phục sự cố trên

Để khắc phục sự cố trên, hãy thực hiện thao tác ToList () trên studentList trước khi bắt đầu mỗi lần lặp.

foreach (var student in studentsList.ToList())

Ví dụ

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; }
   }
}

Đầu ra của đoạn mã trên là

Đầu ra

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