У меня есть список сохраненных в списке результатов следующим образом:
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}");
}
}
}
}