Как удалить элемент из списка в С#?

У меня есть список сохраненных в списке результатов следующим образом:

var resultlist = results.ToList();

Это выглядит примерно так:

ID FirstName  LastName
-- ---------  --------
1  Bill       Smith
2  John       Wilson
3  Doug       Berg

Как удалить идентификатор 2 из списка?

Ответ 1

List<T> имеет два метода, которые вы можете использовать.

RemoveAt (int index) можно использовать, если вы знаете индекс элемента. Например:

resultlist.RemoveAt(1);

Или вы можете использовать Удалить (элемент T):

var itemToRemove = resultlist.Single(r => r.Id == 2);
resultList.Remove(itemToRemove);

Когда вы не уверены, что элемент действительно существует, вы можете использовать SingleOrDefault. SingleOrDefault вернет null, если нет элемента (Single выдаст исключение, если он не сможет найти элемент). Оба будут бросать, когда есть дублирующее значение (два элемента с тем же id).

var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
    resultList.Remove(itemToRemove);

Ответ 2

resultList = results.Where(x=>x.Id != 2).ToList();

Там немного помощника Linq, который мне нравится, который легко реализовать, и может делать запросы с "где нет", условия немного легче читать:

public static IEnumerable<T> ExceptWhere<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
    return source.Where(x=>!predicate(x));
}

//usage in above situation
resultList = results.ExceptWhere(x=>x.Id == 2).ToList();

Ответ 3

Короткий ответ:
Удалить (из списка results)

results.RemoveAll(r => r.ID == 2); удалит элемент с идентификатором 2 в results (на месте).

Фильтр (без удаления из исходного списка results):

var filtered = result.Where(f => f.ID != 2); возвращает все элементы, кроме одного с идентификатором 2

Подробный ответ:

Я думаю .RemoveAll() очень гибок, потому что вы можете иметь список идентификаторов элементов, которые вы хотите удалить - пожалуйста, посмотрите на следующий пример.

Если у вас есть:

class myClass {
    public int ID; public string FirstName; public string LastName;
}

и присваивает некоторые значения results следующим образом:

var results=new List<myClass> {
    new myClass()  { ID=1, FirstName="Bill", LastName="Smith" },
    new myClass()  { ID=2, FirstName="John", LastName="Wilson" },
    new myClass()  { ID=3, FirstName="Doug", LastName="Berg" },
    new myClass()  { ID=4, FirstName="Bill", LastName="Wilson" },
};

Затем вы можете определить список идентификаторов для удаления:

var removeList = new List<int>() { 2, 3 };

И просто используйте это, чтобы удалить их:

results.RemoveAll(r => removeList.Any(a => a==r.ID));

Он удалит элементы 2 и 3 и сохранит элементы 1 и 4, как указано в removeList. Обратите внимание, что это происходит на месте, поэтому никаких дополнительных назначений не требуется.

Конечно, вы также можете использовать его для отдельных предметов, таких как:

results.RemoveAll(r => r.ID==4);

где он удалит Билл с ID 4 в нашем примере.


DotNetFiddle: запустить демо

Ответ 4

Есть другой подход. Он использует List.FindIndex и List.RemoveAt.

Хотя я бы, вероятно, использовал решение, представленное KeithS (просто простое Where/ToList), этот подход отличается тем, что он мутирует исходный объект списка. Это может быть хорошей (или плохой) "функцией" в зависимости от ожиданий.

В любом случае FindIndex (в сочетании с защитой) гарантирует, что RemoveAt будет корректным, если в идентификаторах есть пробелы или неправильный порядок и т.д., А использование RemoveAt (vs Remove) позволяет избежать повторного поиска O (n) через список.

Вот фрагмент кода LINQPad:

var list = new List<int> { 1, 3, 2 };
var index = list.FindIndex(i => i == 2); // like Where/Single
if (index >= 0) {   // ensure item found
    list.RemoveAt(index);
}
list.Dump();        // results -> 1, 3

Удачного кодирования.

Ответ 5

Вы не укажете, какой список, но общий список может использовать либо метод RemoveAt(index), либо метод Remove(obj):

// Remove(obj)
var item = resultList.Single(x => x.Id == 2);
resultList.Remove(item);

// RemoveAt(index)
resultList.RemoveAt(1);

Ответ 6

Более упрощено:

resultList.Remove(resultList.Single(x => x.Id == 2));

нет необходимости создавать новый объект var.

Ответ 7

... или просто resultlist.RemoveAt(1), если вы точно знаете индекс.

Ответ 8

using System;
using System.Collections.Generic;
using System.Linq;
namespace ProductApp
{
    class Program
    {
        public static List<Product> list;
        static void Main(string[] args)
        {

            list = new List<Product>() { new Product() { ProductId=1, Name="Nike 12N0",Brand="Nike",Price=12000,Quantity=50},
                 new Product() { ProductId =2, Name = "Puma 560K", Brand = "Puma", Price = 120000, Quantity = 55 },
                 new Product() { ProductId=3, Name="WoodLand V2",Brand="WoodLand",Price=21020,Quantity=25},
                 new Product() { ProductId=4, Name="Adidas S52",Brand="Adidas",Price=20000,Quantity=35},
                 new Product() { ProductId=5, Name="Rebook SPEED2O",Brand="Rebook",Price=1200,Quantity=15}};

            /*  var query= from x in list select x;
                  foreach (var item in query)
                  {
                      *//*Console.WriteLine(item.ProductId+" "+item.Name+" "+item.Brand+" "+item.Price+" "+item.Quantity );*//*
                      Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
                  }
                  Console.WriteLine("--------------------------------------------------------------");
                  var price= from p in list where p.Price>20000 select p;
                  foreach (var item in price)
                  {
                      *//*Console.WriteLine(item2.ProductId +" "+item2.Name + " " + item2.Brand + " " + item2.Price + " " + item2.Quantity);*//*
                      Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
                  }
                  Console.WriteLine("--------------------------------------------------------------");
                  foreach (var item in list.Where(x2=> x2.Price > 20000))
                  {
                      *//*Console.WriteLine(item.ProductId + " " + item.Name +  " " + item.Brand + " " + item.Price + " " + item.Quantity);*//*
                      Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
                  }
                  Console.WriteLine("--------------------------------------------------------------");
              }*/
            Console.WriteLine("Enter ProductID to remove");
            int uno = Convert.ToInt32(Console.ReadLine());
            var itemToRemove = list.Find(r => r.ProductId == uno);
            if (itemToRemove != null)
                list.Remove(itemToRemove);
            Console.WriteLine($"{itemToRemove.ProductId}{itemToRemove.Name}{itemToRemove.Brand}{itemToRemove.Price}{ itemToRemove.Quantity}");
            Console.WriteLine("------------sucessfully Removed---------------");

            var query2 = from x in list select x;
            foreach (var item in query2)
            {
                /*Console.WriteLine(item.ProductId+" "+item.Name+" "+item.Brand+" "+item.Price+" "+item.Quantity );*/
                Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
            }

        }

    }
}