C#
 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ループはstudentsListで実行されます。学生のIDが0の場合、アイテムはstudentsListから削除されます。この変更により、studentsListが変更(サイズ変更)され、実行時に例外がスローされます。

上記の問題の修正

上記の問題を解決するには、各反復を開始する前に、studentsListに対して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

  1. 0x0000007F エラーを修正および防止する方法

    0x0000007F エラー 0x0000007F エラー これは「ブルー スクリーン」エラーの 1 つで、特定のことをしようとすると、コンピュータが再起動してブルー スクリーンが表示されます。このエラーは、主に Windows の「カーネル」の問題が原因であり、レジストリやシステムの他の部分を使用して修正する必要があります。 0x0000007F エラーとは? oxoooooo7F エラーは、カーネル モード ドライバーを処理するための十分なカーネル領域がコンピューターにない場合に発生します。カーネルは、ほとんどのコンピューター オペレーティング システムの最も中心的なコンポーネント

  2. Windows 10 で「ネットワーク パスが見つかりませんでした」エラーを修正する方法

    マイクロソフト 同じネットワーク上のコンピュータがリモートでファイルにアクセスして交換できるようにします。このデータとリソースの共有手順は、2 つ以上のデバイスを同時に使用する場合に役立ちます。消費者は時々問題に遭遇します。 「ネットワーク パス名が見つかりませんでした」というエラーは一般的です。 4 つのトラブルシューティング手法で問題を解決できます。 Windows で「ネットワーク パスが見つかりませんでした」というエラーを修正する方法 方法 1:TCP/IP NetBIOS ヘルパー サービスを再起動する リモート デバイスに接続してファイルを共有するには、特定の Windows サ