Ich habe eine Liste mit Elementen, die Duplikate enthält, und
ich möchte das letzte Element jeder Gruppe von Duplikaten behalten. Der native DistinctBy LINQ-Operator behält das erste Element aus jeder Gruppe, sodass mein Problem dadurch nicht gelöst wird. Ich habe versucht, einen benutzerdefinierten DistinctLastBy-Operator wie diesen zu implementieren:
Code: Select all
public static IEnumerable DistinctLastBy(
this IEnumerable source,
Func keySelector,
IEqualityComparer comparer = default)
{
ArgumentNullException.ThrowIfNull(source);
ArgumentNullException.ThrowIfNull(keySelector);
return source
.GroupBy(keySelector, comparer)
.Select(g => g.Last());
}
...aber es funktioniert nicht richtig. Es gibt zwar das letzte Element jeder Gruppe zurück, die Elemente befinden sich jedoch nicht in derselben Reihenfolge wie in der Quellsequenz. Hier ist eine minimale Demonstration des wünschenswerten Verhaltens:
Code: Select all
string[] source = ["giraffe", "Elephant", "Cat", "Eagle", "Gazelle", "Cow", "chicken"];
IEnumerable distinct = source
.DistinctLastBy(x => x.Substring(0, 1), StringComparer.OrdinalIgnoreCase);
Console.WriteLine(String.Join(", ", distinct));
Die Tiere gelten als Duplikate, wenn sie mit demselben Buchstaben beginnen. Die gewünschte Ausgabe ist:
Die tatsächliche Ausgabe meiner fehlerhaften Implementierung ist:
Diese Ausgabe ist falsch, da der „Eagle“ vor der „Gazelle“ in der Eingabe platziert wird, also sollte er auch vor der „Gazelle“ in der Ausgabe platziert werden.
Online-Demo.
Wie kann ich meinen DistinctLastBy-Operator so korrigieren, dass er die richtige Ausgabe erzeugt?
Ich habe nach einem Duplikat gesucht und Ich habe keine gefunden.