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.