Wie kann ich mit list B
der Person list A
von Objekttyp Person vergleichen basiert auf Eigenschaft Name
und ein Einen list C
diese gemeinsamen sowohl Liste enthält, und list D
denen in list A
aber nicht in list B
?Vergleichen Sie zwei Objektliste und wählen Sie gemeinsam und Differenz Datensätze eine Eigenschaft basiert
Antwort
var a = new List<int>();
var b = new List<int>();
var c = new List<int>();
var d = new List<int>();
c = a.Where(aItem => b.Any(bItem => aItem == bItem)).ToList();
d = a.Except(c).ToList();
Sie können eine beliebige Logik zum Vergleichen von aItem mit bItem verwenden.
Hier sind Erweiterungsmethoden, um das zu tun.
public static class LinqEx
{
public static bool DefaultCompare<T>(T one, T two)
{
return one.Equals(two);
}
public static IEnumerable<T> Common<T>(this IEnumerable<T> first, IEnumerable<T> second)
{
return first.Common(second, DefaultCompare);
}
public static IEnumerable<T> Common<T>(this IEnumerable<T> first, IEnumerable<T> second, Func<T, T, bool> compare)
{
return first.Where(i1 => second.Any(i2 => compare(i1, i2)));
}
public static IEnumerable<T> Common<T>(this IEnumerable<T> first, IEnumerable<T> second, out IEnumerable<T> difference)
{
return first.Common(second, out difference, DefaultCompare);
}
public static IEnumerable<T> Common<T>(this IEnumerable<T> first, IEnumerable<T> second, out IEnumerable<T> difference, Func<T, T, bool> compare)
{
var common = first.Common(second, compare);
difference = first.Except(common);
return common;
}
public static IEnumerable<T> Common<T>(this IEnumerable<T> first, IEnumerable<T> second, out List<T> difference)
{
IEnumerable<T> d;
var common = first.Common(second, out d);
difference = d.ToList();
return common;
}
public static IEnumerable<T> Common<T>(this IEnumerable<T> first, IEnumerable<T> second, out List<T> difference, Func<T, T, bool> compare)
{
IEnumerable<T> d;
var common = first.Common(second, out d, compare);
difference = d.ToList();
return common;
}
}
Verbrauch:
List<myObjectType> d;
c = a.Common(b, out d, (i1, i2) => i1.Name == i2.Name).ToList();
Die kurze Antwort ist unten:
var c = listA.Join(listB, a => a.Name, b => b.Name, (a, b) => a).ToList();
var d = listA.Except(c).ToList();
Dadurch werden die beiden Listen auf der Grundlage der Name
Eigenschaft jedes Objekts beitreten und die gemeinsamen Objekte zurück aus erste Liste. Die Except()
-Methode gibt Objekte zurück, die sich in listA
nicht in c
befinden; Der Vergleich wird mit Object.ReferenceEquals()
durchgeführt und die Methode schlägt fehl, wenn Sie (a, b) => a
zu (a, b) => b
ändern. Damit eine solche Situation vermeiden Sie eine IEqualityComparer<Person>
implementieren und an die Methode Except()
wie dies passieren:
var comparer = new PersonComparer(); // the class that implements IEqualityComparer<Person>
var d = listA.Except(c, comparer).ToList();
Ich habe 'Where' und 'Any' verwendet, um IEqualityComparer nicht implementieren zu müssen. Mit 'Any' können Sie ein einfaches Prädikat angeben, um die Elemente zu vergleichen. – SimpleVar
@YoryeNathan - 'Where()' und 'Any()' in Ihrem Beispiel haben nichts mit 'IEqualityComparer' zu tun; Sie haben diese Methoden als Ersatz für 'Join()' verwendet. Eine Implementierung von 'IEqualityComparer' wird für die' Except() 'Methode empfohlen, um einen Vergleich durch Objektreferenz zu vermeiden und durch eine benutzerdefinierte Logik zu vergleichen (in diesem Fall - der Wert der' Name' Eigenschaft). – RePierre
IEqualityComparer für jede Vergleichslogik implementieren? "Ja wirklich?" Any (item1 => item1.Name == item2) ist ein perfektes Vergleichsverfahren und es ist nicht erforderlich, dass eine ganze Klasse sie nach Namen vergleicht. – SimpleVar
Meine Antwort ist ähnlich wie die anderen hier, aber die Intersect()
Methode für die erste Hälfte mit, die ist die einfachste und richtige Weg, ich fühle mich, den Satz von Elementen zu erhalten, die in beiden Sätzen vorhanden sein:
var a = new[] {new Person("Alice"), new Person("Bob")};
var b = new[] {new Person("Bob"), new Person("Charlie")};
var inBoth = a.Intersect(b, new PersonNameEqualityComparer());
var notInB = a.Except(b, , new PersonNameEqualityComparer());
inBoth
Bob enthalten, während notInB
Alice enthalten wird.
Das einzige Problem hier ist, dass Intersect
einen Gleichheitsvergleich benötigt, der zwei Person-Objekte abrufen und anhand ihres Namens feststellen kann, ob sie gleich sind. Ich wünschte, wir könnten hier nur einen Lambda-Ausdruck angeben, aber bis dahin ist die Implementierung einfach genug:
class PersonNameEqualityComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.Name == y.Name;
}
public int GetHashCode(Person obj)
{
return obj.Name.GetHashCode();
}
}
- 1. Vergleichen Sie zwei Datensätze und Werte in einem neuen Datensatz
- 2. Vergleichen Sie zwei Datensätze in C#
- 3. Wählen und löschen Sie veraltete doppelte Datensätze?
- 4. Wählen Sie zufällige Datensätze
- 5. Vergleichen Sie zwei große Wörterbücher und erstellen Listen von Werten für Schlüssel, die sie gemeinsam
- 6. Wählen Sie und löschen Sie doppelte Datensätze mit spezifischen ID
- 7. LINQ: Differenz zwischen 'c Wählen Sie' und 'neu auswählen (c ...'
- 8. Wählen Sie Datensätze zwischen zwei Daten in zwei Spalten
- 9. Iterate durch zwei Spalten und vergleichen sie
- 10. Vergleichen von zwei Arbeitsblättern und Hervorheben der Differenz
- 11. So vergleichen Sie zwei deutlich unterschiedliche Objekte mit ähnlichen Eigenschaften
- 12. Wählen Sie eine Eltern-Eigenschaft und alle Kinder mit linq
- 13. PHP und 2 mehrdimensionales Array vergleichen basiert auf zwei Schlüsselwerte
- 14. Linq und wählen Sie mit zwei Tabellen
- 15. Vergleichen Sie zwei Bilder und überprüfen Sie die Gleichheit
- 16. Excel - Vergleichen von zwei Spalten, um eine Differenz zu erhalten
- 17. Wählen Sie obere n Datensätze basierend auf ordinal und Attributdaten
- 18. Vergleichen Sie zwei Spalten mit VBA, und markieren Sie Unterschiede
- 19. Vergleichen Sie zwei Spalten und identifizieren Sie Zeichendifferenz in R
- 20. Vergleichen Sie zwei Tabellenzeilen und entfernen Sie, wenn übereinstimmen
- 21. Wählen Sie zwei Farben und erhalten Sie n Farben zwischen
- 22. Vergleichen Sie zwei Datumsangaben - ohne Stunde und Sekunde
- 23. Vergleichen Sie zwei Verzeichnisbäume
- 24. Vergleichen Sie zwei NSDates
- 25. Vergleichen Sie zwei Dateien in UNIX
- 26. Vergleichen Sie zwei json
- 27. Vergleichen Sie zwei IEnumerable
- 28. Wählen Sie Datensätze in Rechteck
- 29. ASP.NET Gridview - Checkbox - Wählen Sie mehrere Zeilen und Datensätze erhalten
- 30. Vergleichen Sie zwei Hashsets?
Ist das eine Frage oder ein Zungenbrecher? – JotaBe