【问题标题】:How to delete an item from a generic list如何从通用列表中删除项目
【发布时间】:2011-06-21 16:37:42
【问题描述】:

我有一个通用列表

如何删除项目?

前:

Class Student
{
    private number;
    public Number
    {
        get( return number;)
        set( number = value;)
    }

    private name;
    public Name
    {
        get( return name;)
        set( name = value;)
    }

    main()
    {
        static List<student> = new list<student>();

        list.remove...???
    }
}

【问题讨论】:

标签: c# list generics


【解决方案1】:

嗯,没有什么要删除的,因为您的列表是空的(您也没有给它一个标识符,所以您的代码不会编译)。您可以使用Remove(T item)RemoveAt(int index) 分别删除一个对象或指定索引处的对象(一旦它实际包含某些内容)。

人为的代码示例:

void Main(...)
{
    var list = new List<Student>();
    Student s = new Student(...);
    list.Add(s);

    list.Remove(s); //removes 's' if it is in the list based on the result of the .Equals method

    list.RemoveAt(0); //removes the item at index 0, use the first example if possible/appropriate
}

【讨论】:

  • 你应该使用.RemoveAt(0)来删除基于索引号的东西.Remove(0)是行不通的。
【解决方案2】:


从您的 cmets 中,我得出结论,您从输入中读取了学生姓名,您需要删除具有给定姓名的学生。

class Student {
    public string Name { get; set; }
    public int Number { get; set; }

    public Student (string name, int number)
    {
        Name = name;
        Number = number;
    }
}


var students = new List<Student> {
    new Student ("Daniel", 10),
    new Student ("Mike", 20),
    new Student ("Ashley", 42)
};

var nameToRemove = Console.ReadLine ();
students.RemoveAll (s => s.Name == nameToRemove); // remove by condition

请注意,这将删除所有具有给定名称的学生。

如果需要删除第一个按名字找到的学生,先用First方法找到他,然后调用Remove作为实例:

var firstMatch = students.First (s => s.Name == nameToRemove);
students.Remove (firstMatch);

如果您想在删除他之前确保只有 一个 学生具有给定的名字,请以类似的方式使用 Single

var onlyMatch = students.Single (s => s.Name == nameToRemove);
students.Remove (onlyMatch);

请注意,Single 调用 失败,如果没有一项与谓词完全匹配。

【讨论】:

  • @OP:请记住,在实际应用程序中按名称删除学生会很愚蠢,因为 StudentName 不会是唯一的,因此您很可能会删除错误的学生。
【解决方案3】:
List<Student> students = new List<Student>();
students.Add(new Student {StudentId = 1, StudentName = "Bob",});
students.RemoveAt(0); //Removes the 1st element, will crash if there are no entries

OR 删除已知学生。

//Find a Single Student in the List.
Student s = students.Where(s => s.StudentId == myStudentId).Single();
//Remove that student from the list.
students.Remove(s);

【讨论】:

  • 感激列表已经被填满了。学生编号取自输入,我从列表中删除。
  • 对不起,我不明白你在追求什么。我已经在上面更新了我的答案。
  • 列表 lst=新列表();
  • obj.number = "101"; obj.name=“AA”; lst.add(obj);
  • 我检查了鳕鱼。学生呢?
【解决方案4】:

好吧,你没有给你的列表起个名字,而且你的一些语法很奇怪。

void main()
{
   static List<Student> studentList = new List<Student>();
}

// later
void deleteFromStudents(Student studentToDelete)
{
   studentList.Remove(studentToDelete);
}

这里详细介绍了更多的删除功能:C# List Remove Methods

【讨论】:

  • 我想你忘记了void s。此外,在 C# 中,方法名称通常大写。
  • @gaearon - 嗯,是的......不过这是出于演示目的。
【解决方案5】:

int count=queue.Count;

        while(count>0)
        {
            HttpQueueItem item = queue[0];
            /// If post succeeded..
            if (snd.IsNotExceedsAcceptedLeadsPerDayLimit(item.DataSaleID, item.AcceptedLeadsPerDayLimit) && snd.PostRecord(item.DataSaleDetailID, item.PostString, item.duplicateCheckHours, item.Username, item.Password, item.successRegex))
            {
                if (item.WaitTime > 0)
                    Thread.Sleep(item.WaitTime);
                queue.Remove(item);
            }
                ///If Exceeds Accepted leads per day limit by DataSale..
            else if (!snd.IsNotExceedsAcceptedLeadsPerDayLimit(item.DataSaleID, item.AcceptedLeadsPerDayLimit))
            {
                queue.RemoveAll(obj => obj.DataSaleID == item.DataSaleID);
            }
                /// If Post failed..
            else //if (!snd.PostRecord(item.DataSaleDetailID, item.PostString, item.duplicateCheckHours, item.Username, item.Password, item.successRegex))
            {
                queue.Remove(item);
            }
            count = queue.Count;
        }

【讨论】:

    【解决方案6】:

    要从网格视图的通用列表中删除一行或记录,只需编写此代码-

    List<Address> people = new List<Address>();
    Address t = new Address();
    people.RemoveAt(e.RowIndex);
    grdShow.EditIndex = -1;
    grdShow.DataSource = people;
    grdShow.DataBind();
    

    【讨论】:

      【解决方案7】:

      也许您可以使用Dictionary&lt;string, Student&gt; 而不是List&lt;Student&gt;

      添加学生时,请添加其 ID 或名称或任何可以唯一标识它的内容。然后你可以简单地拨打myStudents.Remove(myStudentId)

      【讨论】:

      • 请检查示例(学生人数是关键)
      • 我认为我们需要考虑在这种情况下使用字典的操作 - 字典的构造很慢,插入、更新和删除意味着必须生成和存储哈希,使其变慢比列表。但出于检索目的,字典可能更有效,因为有一个独特的价值可供搜索
      【解决方案8】:

      试试 linq:

        var _resultList = list.Where(a=>a.Name != nameToRemove).Select(a=>a);
      

      【讨论】:

        【解决方案9】:

        我做了一个包含7张牌的程序,然后洗牌,希望能帮到他们

        class Program
        {
        
            static void Main(string[] args)
            {
                Random random = new Random(); 
                var cards = new List<string>();
                //CARDS VECRTOR
                String[] listas = new String[] { "Card 1", "Card 2", "Card 3", "Card 4", "Card 5", "Card 6", "Card 7"};
        
        
                for (int i = 0; i<= cards.Count; i++)
                {
        
                    int number = random.Next(0, 7); //Random number 0--->7
        
        
                    for (int j = 0; j <=6; j++)
                    {
                        if (cards.Contains(listas[number])) // NO REPEAT SHUFFLE
                        {
        
                            number = random.Next(0, 7); //AGAIN RANDOM
        
                        }
                        else
                        {
                            cards.Add(listas[number]); //ADD CARD
                        }
                    }
        
                }
        
                Console.WriteLine(" LIST CARDS");
        
                foreach (var card in cards)
                {
                    Console.Write(card + " ,");
        
        
                }
        
                Console.WriteLine("Total Cards: "+cards.Count);
        
                //REMOVE
        
                for (int k = 0; k <=6; k++)
                {
                   // salmons.RemoveAt(k);
                    Console.WriteLine("I take the card: "+cards.ElementAt(k));
                    cards.RemoveAt(k); //REMOVE CARD
                    cards.Insert(k,"Card Taken"); //REPLACE INDEX
                    foreach (var card in cards)
                    {
                        Console.Write(card + " " + "\n");
        
                    }
        
        
                }
        
        
                Console.Read(); //just pause
        
            }
        
        
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-19
          • 2016-03-12
          • 1970-01-01
          • 1970-01-01
          • 2022-12-20
          相关资源
          最近更新 更多