Самый простой способ - создать ReverseComparer(Of T)
, который можно построить из существующего IComparer(Of T)
, и отменить сравнение. (Просто вызовите существующее сравнение с обратным порядком аргументов - не не отменяйте результат вместо этого; это не удается для Int32.MinValue
.) У меня есть такой класс в C # уже в MiscUtil , если тебе интересно.
Тогда вам просто нужно отсортировать, передавая восходящий компаратор или создав обратный компаратор из восходящего.
РЕДАКТИРОВАТЬ: Как представляется, я не проясняю себя, я имею в виду метод расширения - написанный на C #, но должно быть легко преобразовать его в VB:
public static void Sort<T>(this List<T> list,
IComparer<T> comparer,
bool ascending)
{
if (!ascending)
{
comparer = new ReverseComparer<T>(comparer);
}
list.Sort(comparer);
}
или для Comparison<T>
:
public static void Sort<T>(this List<T> list,
Comparison<T> comparison,
bool ascending)
{
if (!ascending)
{
// Avoid capturing the variable we're modifying!
Comparison<T> originalComparison = comparison;
comparison = (x, y) => originalComparison(y, x);
}
list.Sort(comparison);
}
Конечно, я бы обычно использовал OrderBy
и OrderByDescending
, если вам действительно не нужно изменять исходный список ...
РЕДАКТИРОВАТЬ: Дальнейшее примечание: как предложено Конрадом, вы можете захотеть перечислить с членами Ascending
и Descending
вместо флага bool
, просто для ясности.