Давайте реализуем простой метод расширения :
public static partial class ComparerExtensions {
public static IComparer<T> Reverse<T>(this IComparer<T> comparer) {
if (null == comparer)
throw new ArgumentNullException(nameof(comparer));
return Comparer<T>.Create((left, right) => comparer.Compare(right, left));
}
}
Затем вы можете отменить любой компаратор (ICompare<T>
), который вам нравится:
MyList.Sort(YourCustomComparer.Reverse());
В вашем случае (немного странная реализация с использованием компаратора IDisposable
):
using (var naturalComparer = new NaturalComparer()) {
contents.Sort(naturalComparer.Reverse());
}
Редактировать: В случае C # 4.0 или ранееверсия (которая не имеет Comparer<T>.Create
), мы можем реализовать метод расширения следующим образом:
public static partial class ComparerExtensions {
private sealed class ReversedComparer<T> : IComparer<T> {
private readonly IComparer<T> m_Comparer;
public ReversedComparer(IComparer<T> comparer) {
m_Comparer = comparer;
}
public int Compare(T x, T y) {
return m_Comparer.Compare(y, x);
}
}
public static IComparer<T> Reverse<T>(this IComparer<T> comparer) {
if (null == comparer)
throw new ArgumentNullException(nameof(comparer));
return new ReversedComparer<T>(comparer);
}
}