Wenn Sie projizierte Schlüssel konsistent vergleichen möchten (z. B. eine einzelne Eigenschaft), können Sie eine Klasse definieren, die die gesamte Schlüsselvergleichslogik für Sie kapselt, einschließlich Nullprüfungen, Schlüsselextraktion für beide Objekte und Schlüsselvergleich unter Verwendung des angegebenen oder standardmäßigen inneren Vergleicher:
public class KeyComparer<TSource, TKey> : Comparer<TSource>
{
private readonly Func<TSource, TKey> _keySelector;
private readonly IComparer<TKey> _innerComparer;
public KeyComparer(
Func<TSource, TKey> keySelector,
IComparer<TKey> innerComparer = null)
{
_keySelector = keySelector;
_innerComparer = innerComparer ?? Comparer<TKey>.Default;
}
public override int Compare(TSource x, TSource y)
{
if (object.ReferenceEquals(x, y))
return 0;
if (x == null)
return -1;
if (y == null)
return 1;
TKey xKey = _keySelector(x);
TKey yKey = _keySelector(y);
return _innerComparer.Compare(xKey, yKey);
}
}
Zur Vereinfachung eine Fabrikmethode:
public static class KeyComparer
{
public static KeyComparer<TSource, TKey> Create<TSource, TKey>(
Func<TSource, TKey> keySelector,
IComparer<TKey> innerComparer = null)
{
return new KeyComparer<TSource, TKey>(keySelector, innerComparer);
}
}
Sie könnten dies dann folgendermaßen verwenden:
var sortedSet = new SortedSet<MyClass>(KeyComparer.Create((MyClass o) => o.MyProperty));
In meinem Blogbeitrag finden Sie eine ausführliche Beschreibung dieser Implementierung.