从列表中删除对象<>在C#中

时间:2015-10-03 17:57:30

标签: c# list

我有一个控制台应用程序项目,其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);
                }
            }
        }
    }
}

2 个答案:

答案 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));