Ich würde annehmen, dass es eine einfache LINQ-Abfrage gibt, ich bin mir einfach nicht ganz sicher, wie.
Angesichts dieses Codes:
class Program
{
static void Main(string[] args)
{
List<Person> peopleList1 = new List<Person>();
peopleList1.Add(new Person() { ID = 1 });
peopleList1.Add(new Person() { ID = 2 });
peopleList1.Add(new Person() { ID = 3 });
List<Person> peopleList2 = new List<Person>();
peopleList2.Add(new Person() { ID = 1 });
peopleList2.Add(new Person() { ID = 2 });
peopleList2.Add(new Person() { ID = 3 });
peopleList2.Add(new Person() { ID = 4 });
peopleList2.Add(new Person() { ID = 5 });
}
}
class Person
{
public int ID { get; set; }
}
Ich möchte eine LINQ-Abfrage durchführen, um mir alle Personen mitzuteilen peopleList2
, die nicht anwesend sind peopleList1
.
Dieses Beispiel sollte mir zwei Personen geben (ID = 4 & ID = 5)
Antworten:
Dies kann mit dem folgenden LINQ-Ausdruck behoben werden:
Eine alternative Möglichkeit, dies über LINQ auszudrücken, die einige Entwickler besser lesbar finden:
quelle
Wenn Sie die Gleichheit der Menschen überschreiben, können Sie auch Folgendes verwenden:
Except
sollte deutlich schneller sein als dieWhere(...Any)
Variante, da sie die zweite Liste in eine Hashtabelle einfügen kann.Where(...Any)
hat eine Laufzeit von,O(peopleList1.Count * peopleList2.Count)
während Varianten, die aufHashSet<T>
(fast) basieren , eine Laufzeit von habenO(peopleList1.Count + peopleList2.Count)
.Except
Entfernt implizit Duplikate. Dies sollte sich nicht auf Ihren Fall auswirken, könnte jedoch in ähnlichen Fällen ein Problem darstellen.Oder wenn Sie schnellen Code möchten, aber die Gleichheit nicht überschreiben möchten:
Diese Variante entfernt keine Duplikate.
quelle
Equals
es überschrieben worden wäre, um IDs zu vergleichen.Oder wenn Sie es ohne Verneinung wollen:
Grundsätzlich heißt es, alle von peopleList2 abrufen, wobei sich alle IDs in peopleList1 von den IDs in peopleList2 unterscheiden.
Nur ein bisschen anders als die akzeptierte Antwort :)
quelle
Da alle bisherigen Lösungen eine flüssige Syntax verwendeten, finden Sie hier eine Lösung für die Syntax von Abfrageausdrücken für Interessierte:
Ich denke, es unterscheidet sich genug von den Antworten, die für einige von Interesse sind, obwohl ich dachte, dass es für Listen höchstwahrscheinlich nicht optimal wäre. Für Tabellen mit indizierten IDs wäre dies definitiv der richtige Weg.
quelle
Etwas spät zur Party, aber eine gute Lösung, die auch mit Linq to SQL kompatibel ist, ist:
Ein großes Lob an http://www.dotnet-tricks.com/Tutorial/linq/UXPF181012-SQL-Joins-with-C
quelle
Klaus 'Antwort war großartig, aber ReSharper wird Sie bitten, "den LINQ-Ausdruck zu vereinfachen":
var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));
quelle
Mit dieser Enumerable-Erweiterung können Sie eine Liste der auszuschließenden Elemente und eine Funktion zum Suchen des Schlüssels definieren, der zum Durchführen eines Vergleichs verwendet werden soll.
Sie können es auf diese Weise verwenden
quelle
Hier ist ein Arbeitsbeispiel, das IT-Kenntnisse vermittelt, über die ein Bewerber noch nicht verfügt.
quelle
Extrahieren Sie zunächst IDs aus der Sammlung where-Bedingung
Zweitens: Verwenden Sie "Vergleichen", um IDs auszuwählen, die sich von der Auswahl unterscheiden
Natürlich können Sie x.key! = "TEST" verwenden, dies ist jedoch nur ein Beispiel
quelle
Sobald Sie einen generischen FuncEqualityComparer geschrieben haben, können Sie ihn überall verwenden.
quelle