Angenommen, ich habe eine Klasse.net Distinct() und komplex conditons
public class Audio
{
public string artist { get; set; }
public string title { get; set; }
// etc.
}
Jetzt mag ich Duplikate in Liste solchen Audio der durch Ähnlichkeit filtern (nicht Exact Match) Zustand. Grundlegend ist die Levendein-Distanz mit der Schwellwertkorrektur durch die Gesamtlänge der Saite. Das Problem ist, dass ein allgemeiner Hinweis zu IEqualityComparer lautet: "Implementiere immer GetHashCode und Compare". In GetHashCode kann ich den Abstand zwischen den Strings natürlich nicht berechnen, da es sich überhaupt nicht um eine Vergleichsmethode handelt. In diesem Fall werden jedoch ähnliche Audiodaten unterschiedliche Hashwerte zurückgeben und Distinct() behandelt sie als unterschiedliche Objekte und die compare() -Methode wird nicht ausgelöst.
Ich habe versucht, GetHashCode immer zu zwingen, gibt 0 zurück, also Compare für jedes-zu-jedem Objekt in der Sammlung aufgerufen, aber das ist langsam. So, endlich, eine Frage: Gibt es irgendetwas, was ich tun kann mit .net aus der Box oder sollte ich einen guten Algorithmus für die Filterung suchen?
Ich denke, Sie missbrauchen 'Distinct' hier. Zum Beispiel können Sie "ab" als ein Duplikat von "bc" und "bc" als ein Duplikat von "cd" betrachten, aber Sie würden "ab" nicht als ein Duplikat von "cd" betrachten. Dies macht "Distinct" nicht für Sie arbeiten. – Gabe
Danke, Gabe, ich habe nicht darüber nachgedacht. Ich sehe, ich sollte gerade ein gutes Buch über Suchalgorithmen lesen. – Tommi
Wenn Sie eine statische, lange Liste von Objekten haben - werfen Sie einen Blick auf BK Trees, sie können Ihnen sehr dabei helfen, was Sie erreichen wollen. Ich habe einmal die Implementierung in F # geschrieben, es ist ziemlich brauchbar für dein Ziel. Sie können jedes Objekt darin speichern, vergleichen Sie es mit Levenshtein auf einer beliebigen Eigenschaft mit der Selektorfunktion. Wenn Sie interessiert sind, kann ich Code auf bitbucket hochladen. – rkrahl