HashSet Konstruktor mit benutzerdefinierten IEqualityCompare definiert durch die lambda?
Derzeit die HashSet<T>
Konstruktor, der erlaubt Ihnen zu definieren, Ihre Geschlechter-Vergleich, selbst ist der HashSet<T>(IEqualityComparer<T> comparer)
Konstruktor.
Ich würde gerne die Definition dieses EqualityComparer als ein lambda.
Fand ich in diesem blog-post gemacht hat, dass eine Klasse, mit der Sie die Erstellung Ihrer comparer durch die lambda und dann versteckt der Bau dieser Klasse mit einem extention-Methode zu tun, zum Beispiel eine Ausnahme().
Nun möchte ich das gleiche tun, aber mit einem Konstruktor. Ist es möglich, erstellen Sie einen Konstruktor durch eine Erweiterung Methode? Oder gibt es eine andere Möglichkeit, die ich irgendwie schaffen, eine HashSet<T>(Func<T,T,int> comparer)
?
--UPDATE--
Für Klarheit, dies ist (ein Ausschnitt) eines freehand-version von, was ich versuche zu erreichen:
HashSet<FileInfo> resultFiles = new HashSet<FileInfo>(
srcPath.GetFiles(),
new LambdaComparer<FileInfo>(
(f1, f2) => f1.Name.SubString(10).Equals(f2.Name.SubString(10))));
oder mehr ideal
HashSet<FileInfo> resultFiles = new HashSet<FileInfo>(
srcPath.GetFiles(),
(f1, f2) => f1.Name.SubString(10).Equals(f2.Name.SubString(10)));
- Das blog-post ist gebrochen IMO - es erzeugt einen hashcode, gerade indem Sie den ursprünglichen hash-code, was dazu führt, hashes, die unvereinbar mit der Gleichheit Funktion. Ich habe kommentiert auf den blog.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, Sie können keine Konstruktoren (auch mit Erweiterung Methoden).
Vorausgesetzt, Sie haben einige Magische Weg, um von einem
Func<T,T,int>
zu einemIEqualityComparer<T>
(ich wäre daran interessiert, zu Lesen, dass blog-post, wenn Sie zitieren es) - dann die nächsten, die Sie tun können, ist wahrscheinlich so etwas wie:Jedoch; ich bin zweifelhaft, was Sie tun können, mit einem lambda-Ausdruck für die Gleichheit... Sie haben zwei Konzepte auszudrücken: hashing und wahre Gleichberechtigung. Was wäre deine lambda Aussehen? Wenn Sie versuchen, zu verschieben, um die untergeordneten Eigenschaften, dann vielleicht ein
Func<T,TValue>
wählen Sie die Eigenschaft, und verwenden SieEqualityComparer<TValue>.Default
intern... so etwas wie:Marc hat Recht. Es gibt keine einfache Möglichkeit für ein einzelnes lambda-Ausdrücken, die benötigten Informationen für beide Equals und GetHashCode. Und wenn Sie eine GetHashCode, dass gibt unterschiedliche hashes für die "gleiche" Elemente, die zu falschem Verhalten.
Hier ist mein Kompromiss Umsetzung. Sie ermöglichen es jedem generischen Func (wie Marc, ich missachtet int, weil Sie es nicht erklären), und das wird richtig (in, dass es mit dem Vertrag entspricht), aber sehr ineffizient Verhalten.
Empfehle ich Ihnen-stick mit einer echten IEqualityComparer, die Ihre Bedürfnisse erfüllt. Es ist eine Schande, dass C# nicht unterstützt, anonyme innere Klassen, aber.