Ich habe eine Struktur wie diese:
public struct stuff
{
public int ID;
public int quan;
}
und möchte das Produkt entfernen, wo ID
ist 1.
Ich versuche dies derzeit:
prods.Remove(new stuff{ prodID = 1});
und es funktioniert nicht.
DANK AN ALLE
c#
.net
entity-framework
linq
Nur Schatten
quelle
quelle
if (stuffToRemove != default(stuff))
.Wenn Ihr Sammlungstyp a ist
List<stuff>
, ist der beste Ansatz wahrscheinlich der folgende:prods.RemoveAll(s => s.ID == 1)
Dies führt nur einen Durchgang (Iteration) über die Liste durch und sollte daher effizienter sein als andere Methoden.
Wenn Ihr Typ allgemeiner ist
ICollection<T>
, kann es hilfreich sein, eine kurze Erweiterungsmethode zu schreiben, wenn Sie Wert auf Leistung legen. Wenn nicht, würden Sie wahrscheinlich mit LINQ (AnrufWhere
oderSingle
) davonkommen .quelle
Wenn Sie LINQ haben:
var itemtoremove = prods.Where(item => item.ID == 1).First(); prods.Remove(itemtoremove)
quelle
where
Abfrage als Parameter zu First ()Where
mitFirst
prods.Remove(prods.Find(x => x.ID == 1));
quelle
prods.Remove(prods.Single(p=>p.ID == 1));
Sie können die Sammlung in foreach nicht ändern, wie Vincent vorschlägt
quelle
Sie können nur etwas entfernen, auf das Sie einen Verweis haben. Sie müssen also die gesamte Liste durchsuchen:
stuff r; foreach(stuff s in prods) { if(s.ID == 1) { r = s; break; } } prods.Remove(r);
oder
for(int i = 0; i < prods.Length; i++) { if(prods[i].ID == 1) { prods.RemoveAt(i); break; } }
quelle
Hier ist eine Lösung für diejenigen, die sie mit Entity Framework aus der Datenbank entfernen möchten :
prods.RemoveWhere(s => s.ID == 1);
Und die Erweiterungsmethode selbst:
using System; using System.Linq; using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; namespace LivaNova.NGPDM.Client.Services.Data.Extensions { public static class DbSetExtensions { public static void RemoveWhere<TEntity>(this DbSet<TEntity> entities, Expression<Func<TEntity, bool>> predicate) where TEntity : class { var records = entities .Where(predicate) .ToList(); if (records.Count > 0) entities.RemoveRange(records); } } }
PS Dies simuliert die Methode
RemoveAll()
, die für DB-Sets des Entity Frameworks nicht verfügbar ist.quelle
Sie könnten Linq verwenden.
var prod = from p in prods where p.ID != 1 select p;
quelle
prods = prods.Where(p != 1).ToList()
Sie näher dran, ändert dies jedoch nichts an einer Liste, die Sie als Parameter erhalten haben.