এই এররটি তখন ঘটে যখন একটি কালেকশন (যেমন: List) এর ওপর একটি লুপিং প্রসেস চলছে থাকে এবং রানটাইমে সেই কালেকশন মডিফাই হয় (ডেটা অ্যাড বা রিমুভ করা হয়)।
উদাহরণ (এরর জনিত কোড)
using System;
using System.Collections.Generic;
namespace DemoApplication
{
public class Program
{
static void Main(string[] args)
{
try
{
var studentsList = new List
{
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` লুপ `studentsList`-এ এক্সিকিউট হচ্ছে। যখন স্টুডেন্টের Id ০, আইটেমটি `studentsList`- থেকে রিমুভ হয়। এই পরিবর্তনের কারণে `studentsList` মডিফাইড হয়েছে (রিসাইজড) এবং রানটাইমে এক্সসেপশন থ্রো হয়েছে।
সমাধান
উপরের সমস্যা সমাধানের জন্য, প্রতিটি ইটারেশনের শুরুতে `studentsList`-এ `ToList()` অপারেশন পারফর্ম করুন।
foreach (var student in studentsList.ToList())
সolved উদাহরণ
using System;
using System.Collections.Generic;
using System.Linq;
namespace DemoApplication
{
public class Program
{
static void Main(string[] args)
{
var studentsList = new List
{
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