删除类的函数
本文关键字:函数 删除 | 更新日期: 2023-09-27 18:29:43
我的删除函数有问题。除了删除功能外,我什么都能用。
如有任何帮助,我们将不胜感激。我试着更改了一下,但仍然没有删除。我不知道我的remove函数有什么问题。
public class Person
{
private string name;
private string phoneNumber;
public string Name
{
set { name = value; }
get { return name; }
}
public string PhoneNumber
{
set { phoneNumber = value; }
get { return phoneNumber; }
}
public void PrintInfo()
{
Console.WriteLine();
Console.WriteLine(" Name: {0}", name);
Console.WriteLine(" Phone Number: {0}", phoneNumber);
Console.WriteLine();
}
public void SaveASCII(ref StreamWriter output)
{
output.WriteLine(name);
output.WriteLine(phoneNumber);
}
public void LoadASCII(ref StreamReader input)
{
name = input.ReadLine();
phoneNumber = input.ReadLine();
}
}
public class membershipList
{
public Person[] ML = null;
public void AddMember(Person p)
{
if (ML == null)
{
ML = new Person[1];
ML[0] = p;
}
else
{
Person[] temp = ML;
ML = new Person[temp.Length + 1];
for (int i = 0; i < temp.Length; ++i)
{
ML[i] = new Person();
ML[i] = temp[i];
}
ML[temp.Length] = new Person();
ML[temp.Length] = p;
temp = null;
}
}
public void DeleteMember(string p)
{
if (ML != null)
{
foreach (Person pers in ML)
{
if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0)
{
pers.Remove();
break;
}
}
}
else Console.WriteLine("Then list is empty.");
}
// {
// int memberIndex = Array.FindIndex(ML, p => p.Name == name);
// if (memberIndex == -1)
// {
// Console.WriteLine(name + " had not been added before.");
// return;
// }
// else
// {
// List<Person> tmp = new List<Person>(ML);
// tmp.RemoveAt(memberIndex);
// ML = tmp.ToArray();
// }
// }
// }
public void PrintAll()
{
if (ML != null)
foreach (Person pers in ML)
pers.PrintInfo();
else Console.WriteLine("Then list is empty");
}
public void Search(string p)
{
if (ML != null)
{
foreach (Person pers in ML)
{
if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0)
{
Console.WriteLine("1 Record Found:");
pers.PrintInfo();
break;
}
}
}
else Console.WriteLine("Then list is empty.");
}
public void ReadASCIIFile()
{
StreamReader input = new StreamReader("memberlist.dat"); ;
try
{
int num = Convert.ToInt32(input.ReadLine());
ML = new Person[num];
for (int i = 0; i < num; ++i)
{
ML[i] = new Person();
ML[i].LoadASCII(ref input);
}
input.Close();
}
catch (FormatException e)
{
Console.WriteLine(e.Message);
input.Close();
}
}
public void SaveASCIIFile()
{
StreamWriter output = new StreamWriter("memberlist.dat");
output.WriteLine(ML.Length);
foreach (Person pers in ML)
{
pers.SaveASCII(ref output);
}
output.Close();
}
}
class Program
{
static void Main(string[] args)
{
membershipList ML = new membershipList();
ML.ReadASCIIFile();
string option;
do
{
// Console.Clear();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("MemberShip List MENU");
Console.WriteLine();
Console.WriteLine(" a. Add");
Console.WriteLine(" b. Seach");
Console.WriteLine(" c. Delete");
Console.WriteLine(" d. Print All");
Console.WriteLine(" e. Exit");
Console.WriteLine();
Console.Write("option: ");
option = Console.ReadLine().ToLower();
switch (option)
{
case "a":
Person np = new Person();
Console.Write("Enter Name: ");
np.Name = Console.ReadLine();
Console.Write("Enter PhoneNumber: ");
np.PhoneNumber = Console.ReadLine();
ML.AddMember(np);
break;
case "b":
Console.Write("Enter Name: ");
string name = Console.ReadLine();
ML.Search(name);
break;
case "c":
Console.Write("Enter Name to be Deleted:");
string pers = Console.ReadLine();
ML.DeleteMember(pers);
break;
case "d":
ML.PrintAll();
break;
case "e":
ML.SaveASCIIFile();
Console.WriteLine("BYE...... ");
break;
default:
Console.WriteLine("Invalid Option");
break;
}
} while (option.ToLower() != "d");
}
}
我看到两件事:
- 如果要在列表中添加和删除项,请使用
List<Person>
而不是数组。现在,您需要将数组复制到一个临时列表中,删除该项,然后再复制回一个数组 -
您的
Delete
功能可以只是:if (ML != null) { Person pers = ML.FirstOrDefault(x => x.Name.ToLower() == p.ToLower()); if(pers != null) { ML.Remove(pers); break; } }
您的问题是:
foreach (Person pers in ML)
{
if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0)
{
pers.Remove();
break;
}
}
您正在从正在迭代的集合中移除,这会抛出循环的迭代器。
无论哪种方法都可以反向循环通过集合,因此移除不会丢弃循环的迭代器。
或
创建第二个列表,其中包含要保留的值。所以,从本质上讲,你会做相反的事情;与其删除,不如不将其添加到保留列表中。
您在数组上循环,然后对人员调用remove。关于for each循环的一点是,它使用迭代器,在for each过程中无法修改迭代器。但即使可以,也没那么简单,因为你不能简单地从数组中移除。您可以从泛型List或ListArray中执行此操作,但不能从数组中执行。要遵循您已经遵循的模式(假设您需要使用数组并调整它们的大小),您需要创建一个临时数组,并将ML数组中的所有元素复制到新数组中,减去已删除的成员。
检查我的语法,因为我没有测试这段代码,但你应该知道。
public void DeleteMember(string p)
{
if (ML != null)
{
Person[] tempList = new Person[ML.Length - 1];
bool deletedAPerson = false;
int i = 0;
foreach (Person pers in ML)
{
if (pers.Name.ToLower().CompareTo(p.ToLower()) == 0)
{
deletedAPerson = true;
continue; //skip over this person and do not copy over to the new Array
}
if(i < pers.Length) //if no person was found, prevent index out of bounds exception
tempList[i++] = pers;
}
if(deletedAPerson)
ML = tempList;
}
else Console.WriteLine("Then list is empty.");
}