简体   繁体   中英

Unhandled Exception: System.InvalidOperationException: Collection was modified; enumeration may not execute

I have created code which adds,deletes and modify objects added to the arraylist.when i select the remove method it shows the above error.how do i solve it.This code is where i am running everything.It has an instance of the member class which has all methods neccessary

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MedicalAid
{
class MedicalTest
{

    //instance of MedicalTest class
    public static MedicalTest medicalMember = new MedicalTest();
    //array list to hold member objects
    static List<Member> customer = new List<Member>();
    //instance of Member class
    static Member member = new Member();
    //some important booleans
    private bool isSubscribed;
    private bool isDeducted;
    private bool isToBeRemoved;
    private bool isToBeAdded = true;


    //add passed memebers to arraylist
    public void addMembersToArrayList()
    {
        customer.Add(member1);
        customer.Add(member2);
        isToBeAdded = false;
    }
    //method to add member
     public void AddMember(Member name)
       {
         customer.Add(name);
       }

    //method to remove a member
     public  void RemoveMember(String removeName) {
        foreach (Member i in customer) {

            if (isToBeRemoved)
            {
                if (i.GetName() == removeName)
                {
                    Console.WriteLine("Found and Removed");
                    customer.Remove(i);

                }
                else{Console.WriteLine("Not Found");}
            }


        if(isSubscribed)
        {
        if (i.GetName() == removeName) 
        {
            //if delete member is true,delete member
               Console.WriteLine("Found and Transaction Made");
            i.makeSubscription();
            i.showMember();
            }//closes isToBeDeleted
        else { Console.WriteLine("Not Found"); }
        }

        if(isDeducted){
            if (i.GetName() == removeName)
            {
            //if delete member is true,delete member
            Console.WriteLine("Found and Transaction Made");
             i.makeSubscription();
             i.showMember();
            }//closes isToBeDeleted
            else
            {
                Console.WriteLine("Not Found"); 
            }
        }//closes deducted if
    }

}

    //method to iterate through customer and remove a member
     public void ViewMembers()
     {

        //iterate throus the customer list and print details of any member availabe    
              if(customer.Capacity == 0){
              Console.WriteLine("Medical Aid List is Empty");
              }else{  
              foreach(Member i in customer){
                  i.showMember();
              }
              }
     }

     //create two objects with details
     Member member1 = new Member("male",
                   "Z.N.A",
                   " 272 Area 3 D/Mvura Mutare",
                   "Premium",
                       "JAMES",
                       500.00,
                       "Dr Bvirakure",
                       "xx-xxxxx y XX",
         //spouse
                       "xx/xx/1987",
                       "JOSEPHINE MANYORE",
                       "XX-XXXXX-XX",
         //family doctor
                       "DANGAMVURA SHOPPING MALL",
                   "0773 0733 0734",
         //dependent
                       "male",
                       "ANDREW BLESSING MANYORE",
                       "75-426820 Y 50",
         //bank details
                       "ZABG",
                   "Herbet Chitepo",
                   "xxxxxxxxxxxxx",
                   "xxxxxxxxxxxxx",
                       "Mutare");
     Member member2 = new Member("female",
                   "MINISTRY OF EDUCATION",
                   " 272 Area 3 D/Mvura Mutare",
                   "Premium",
                       "TAPIWA",
                       500.00,
                       "Dr Bvirakure",
                       "xx-xxxxx y XX",
         //spouse
                       "xx/xx/1987",
                       "JAMES MANYORE",
                       "XX-XXXXX-XX",
         //family doctor
                       "DANGAMVURA SHOPPING MALL",
                   "0773 0733 0734",
         //dependent
                       "male",
                       "PORTIA TATENDA MANYORE",
                       "75-426820 Y 50",
         //bank details
                       "ZB",
                   "Herbet Chitepo",
                   "xxxxxxxxxxxxx",
                   "xxxxxxxxxxxxx",
                       "Mutare");
     //method to print saved members


    static void Main(string[] args)
    {
         int option;
         string options;
         //add the members to the arraylist
         if (medicalMember.isToBeAdded)
         {
             medicalMember.addMembersToArrayList();
         }

    do{
       Console.Write("********Medical Aid*********\n"+
                         "1.To Add New Member\n"+
                         "2.To Edit Member Balance if he made a Subscription\n" +
                         "3.To Edit Member Balance if he received a Service\n" +
                         "4.To Delete Old Member\n" +
                         "5.To View Members\n"+
                         "6.To Exit\n"); 
      options = Console.ReadLine();
      option = Convert.ToInt32(options);

      switch(option){

      case 1: member.GetMember();
              medicalMember.AddMember(member);

              break;

     case 2 : medicalMember.isSubscribed = true;
              medicalMember.isDeducted = false;
              medicalMember.isToBeRemoved = false;
              Console.WriteLine("Enter Member Name who made a Subscription\n");
              String memberToGetSer = Console.ReadLine();
              medicalMember.RemoveMember(memberToGetSer);
              break;

      case 3 :medicalMember.isSubscribed = false;
              medicalMember.isDeducted = true;
              medicalMember.isToBeRemoved = false;
              Console.WriteLine("Enter Member Name who received a Service\n");
              String memberToGetSub = Console.ReadLine();
              medicalMember.RemoveMember(memberToGetSub);
              break;

      case 4: medicalMember.isSubscribed = false;
              medicalMember.isDeducted = false;
              medicalMember.isToBeRemoved = true;
              Console.WriteLine("Enter Member Name to remove");
              String memberToRemove = Console.ReadLine();
              medicalMember.RemoveMember(memberToRemove);

              break;

      case 5: medicalMember.ViewMembers();
              break;

      case 6:  Console.WriteLine("******EXITING********");
              Environment.Exit(0);
              break;
        }//closes switch
      }while(option<=5);//closes while
    }//closes main
}//closes class
}

You can't remove elements if you're reading forward through a collection as the enumerator would be invalidated. Try using the RemoveAll method, it will do what you want and simplify your code:

if (isToBeRemoved) // No need for a for loop.
{
    customer.RemoveAll(elem => elem.GetName() == removeName);
}

You can't call Remove() while inside foreach loop (as long as it concerns the collection you are looping through)

use a for loop:

for (int i=0;i<customer.Count;i++)
{
    ......
}

From MSDN:

     The foreach statement is used to iterate through the collection to get the information that you want,
 but can not be used to add or remove items from the source collection to avoid unpredictable side effects.
 If you need to add or remove items from the source collection, use a for loop.

See this for more details

just change this in remove Member:

public  void RemoveMember(String removeName) {
    for (int i=customer.Count - 1;i>=0;i--) {
        if (isToBeRemoved)
        {
            if (customer[i].GetName() == removeName)
            {
                Console.WriteLine("Found and Removed");
                customer.RemoveAt(i);
            }
            else{Console.WriteLine("Not Found");
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM