我有一个控制台应用程序项目,其list
。这包括添加,显示和删除项目的选项,但删除方法不起作用。删除某些内容时应用程序崩溃。请查看下面的代码并提出建议。
class Program
{
public List<CV_details> list = new List<CV_details>();
static void Main()
{
Program p = new Program();
int choice;
do
{
p.menu();
Console.Write("Enter Choice : ");
choice = Convert.ToInt32(Console.ReadLine());
if (choice == 3)
{
Console.Clear();
p.modify();
break;
}
} while (choice != 4);
}
void modify()
{
Console.Write("Enter ID you want to modify : ");
int id = Convert.ToInt32(Console.ReadLine());
var per = new CV_details();
foreach (var person in list)
{
if (person.getID() == id)
{
Console.WriteLine("Serial No. : " + person.getID());
Console.WriteLine("Name : {0} {1}", person.getFname(), person.getlname());
Console.WriteLine("Age : {0}", person.getAge());
Console.WriteLine("Degree : {0}", person.getdegree());
Console.WriteLine();
Console.WriteLine("1) To Delete CV");
Console.WriteLine("2) To Update");
int n;
Console.WriteLine("Enter Choice :");
n = Int32.Parse(Console.ReadLine());
if (n == 1)
{
list.Remove(person);
}
}
}
}
}
答案 0 :(得分:4)
在迭代它时,您无法从列表中删除。
一种方法是创建一个要删除的事物列表,然后在完成迭代后删除它们。
List<CV_details> deleteList = new List<CV_details>();
foreach (var person in list){
if (person.getID()==id)
{
//...
n = Int32.Parse(Console.ReadLine());
if (n == 1)
{
deleteList.Add(person);
}
}
}
foreach (var del in deleteList)
{
list.Remove(del);
}
使用Linq可以用更少的代码行完成此操作。
答案 1 :(得分:0)
实际上,您可以在迭代时从列表中删除,但是您必须使用除foreach之外的其他循环并从列表中删除项目,如:
for(int i=0; i<list.Count;i++)
{
if(something)
{
list.Remove(list[i]);
i--;
}
}
在这种情况下,您还必须减少“我”。变量不跳过另一个对象(由于删除了一个列表)。
我并不是说这是一个很好的解决方案,但可以这样做。
如上所述,添加要删除的项目很不错。在这种情况下,在LINQ而不是foreach循环中删除它们看起来像:
list.Remove(x=>deleteList.Contains(x));