Liste.Außer funktioniert nicht
Ich versuche zu subtrahieren Sie 2 Listen wie unten code assignUsers
hat 3 Einträge und assignedUsers
hat 2 Zeilen. Nach Except
Methode bekomme ich noch 3 Zeilen, obwohl ich nur 1 Datensatz, weil 2 Zeilen in assignedUsers
ist ähnlich assignUsers
var users = accountApp.GetUsersByAccountId(context.GetUserData().AccountId);
List<AssignUserViewModel> assignUsers = Mapper.Map<List<AssignUserViewModel>>(users).ToList();
var mailUsers = mailApp.GetMailAssignedByMailId(id).Select(m => new { m.UserId, m.User.Name }).ToList();
List<AssignUserViewModel> assignedUsers = mailUsers.Select(Mapper.DynamicMap<AssignUserViewModel>).ToList();
assignUsers = assignUsers.Except(assignedUsers).ToList();
- Die mapper-ist es wahrscheinlich, dass Referenzen verloren gehen, und der Typ hat wahrscheinlich keine andere comparer definiert.
- Schreiben Sie eine compare-Funktion mit IComparerer .
- Sie sollten poste es als Antwort 🙂
- Wie kann ich die map anonymen Typ anderen Typ richtig? wenn das der Fall ist
InformationsquelleAutor Ehsan Davoudi | 2012-10-20
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um
Except
Methode funktioniert wie erwartet, die KlasseAssignUserViewModel
mussGetHashCode
undEquals
Methoden korrekt überschrieben.Zum Beispiel, wenn
AssignUserViewModel
Objekte sind eindeutig bestimmt durch IhreId
, definieren Sie die Klasse in dieser Weise:Sonst, wenn Sie nicht können/nicht wollen, ändern Sie die Klasse Umsetzung, die Sie implementieren können, ein
IEqualityComparer<>
und übergeben es an dieExcept
Methode, z.B. :dann Ihr letzter werden würde:
Warum das passiert ist?
Wenn Sie Set-Operationen (Distinct, Except, Intersect, Union) Linq vergleichen müssen-Sequenz(s) Elemente auf Gleichheit. Standardmäßig Linq verwendet Objekt.Gleich und Objekt.GetHashCode Methoden zum vergleichen von Elementen. Wenn diese Methoden nicht überschrieben sind in Ihrer Art, dann base class Implementierung verwendet wird, das vergleichen von Objekten per Referenz-Gleichheit. Default-Implementierung garantiert, dass zwei Objekte die gleiche Referenz haben den gleichen hash-code (also als gleich angesehen). Das ist Ihr Fall.
Mapper
Klasse erstellt neue Instanzen vonAssignUserViewModel
Objekte, die verschiedene Informationsquellen und können nicht gleichwertig behandelt zu werden (selbst wenn alle Feld-Werte sind die gleichen).So, was können wir tun?
Überschreiben
Equals
undGetHashCode
Methoden in Ihrer Klasse. Es ist bis zu Ihnen, wie Sie die Behandlung von Objekten Gleichheit - alle Felder, oder einfach nur Identität. Linq verwenden Ihre Methoden zu vergleichen Elemente.Ihre eigenen comparer (dies ist in der Regel Fall, wenn Sie nicht ändern können Ihr Objekt und setzen
Equals
undGetHashCode
. Ja, alle Linq-Set-Operationen haben zwei überladungen - eine, die verwendet Standard-comparer, und andere, die akzeptiert, dass deins, IEqualityComparer<T>
.Verwendung von anonymen Typen. Alle anonymen Typen bereits generierten Methoden
Equals
undGetHashCode
, die Vergleich aller Eigenschaften, um festzustellen, ob Objekte gleich sind. In diesem Fall brauchen Sie nicht, weder zum ändern der Typ noch zu schaffen comparer.So, Sie haben bereits die Proben der ersten beiden Ansätze, hier ist die Letzte: