Odpowiedzi:
List<T> ma dwie metody, których możesz użyć.
RemoveAt (int index) może być użyty, jeśli znasz indeks elementu. Na przykład:
resultlist.RemoveAt(1);
Lub możesz użyć Usuń (element T) :
var itemToRemove = resultlist.Single(r => r.Id == 2);
resultList.Remove(itemToRemove);
Jeśli nie masz pewności, czy element naprawdę istnieje, możesz użyć funkcji SingleOrDefault . SingleOrDefaultzwróci, nulljeśli nie ma przedmiotu ( Singlezgłasza wyjątek, gdy nie może znaleźć przedmiotu). Oba będą rzucać, gdy będzie zduplikowana wartość (dwa przedmioty o tej samej wartości id).
var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
resultList.Remove(itemToRemove);
resultlist.Items.RemoveAt(1);?
Krótka odpowiedź:
Usuń (z listy results)
results.RemoveAll(r => r.ID == 2);usunie przedmiot z ID 2 w results(na miejscu).
Filtruj (bez usuwania z oryginalnej listy results):
var filtered = result.Where(f => f.ID != 2);zwraca wszystkie elementy oprócz tego z ID 2
Szczegółowa odpowiedź:
Myślę, że .RemoveAll()jest bardzo elastyczny, ponieważ możesz mieć listę identyfikatorów produktów, które chcesz usunąć - zapoznaj się z poniższym przykładem.
Jeśli masz:
class myClass {
public int ID; public string FirstName; public string LastName;
}
i przypisał niektóre wartości do results następujących:
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" },
};
Następnie możesz zdefiniować listę identyfikatorów do usunięcia:
var removeList = new List<int>() { 2, 3 };
I po prostu użyj tego, aby je usunąć:
results.RemoveAll(r => removeList.Any(a => a==r.ID));
Będzie usunąć pozycje 2 i 3 oraz utrzymanie pozycji 1 i 4 - w sposób określony przezremoveList . Pamiętaj, że dzieje się to na miejscu, więc nie jest wymagane dodatkowe przypisanie.
Oczywiście możesz go również używać do pojedynczych elementów, takich jak:
results.RemoveAll(r => r.ID==4);
gdzie usunie to rachunek z identyfikatorem 4 w naszym przykładzie.
DotNetFiddle: Uruchom wersję demo
resultList = results.Where(x=>x.Id != 2).ToList();
Jest mały pomocnik Linq, który mi się podoba, który jest łatwy do wdrożenia i może ułatwić czytanie zapytań w warunkach „gdzie nie”:
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();
List.FindIndex/ List.RemoteAt(które ma cechę „miłą” lub „niezbyt przyjemną” polegającą na mutacji).
Istnieje inne podejście. Wykorzystuje List.FindIndexi List.RemoveAt.
Chociaż prawdopodobnie użyłbym rozwiązania przedstawionego przez KeithS (tylko prosty Where/ ToList), to podejście różni się tym, że mutuje oryginalny obiekt listy. Może to być dobra (lub zła) „cecha” w zależności od oczekiwań.
W każdym razie FindIndex(w połączeniu z osłoną) zapewnia RemoveAtpoprawność, jeśli w identyfikatorach występują luki lub kolejność jest nieprawidłowa itp., A użycie RemoveAt(vs Remove) pozwala uniknąć drugiego przeszukiwania listy O (n) przez listę.
Oto fragment kodu 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
Szczęśliwego kodowania.
Bardziej uproszczone:
resultList.Remove(resultList.Single(x => x.Id == 2));
nie ma potrzeby tworzenia nowego obiektu var.
{
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}};
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}");
}
}
}
}
var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);