Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Метод Enumerable.OrderByDescending<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>)

 

Опубликовано: Октябрь 2016

Сортирует элементы последовательности в порядке убывания с использованием указанного компаратора.

Пространство имен:   System.Linq
Сборка:  System.Core (в System.Core.dll)

public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(
	this IEnumerable<TSource> source,
	Func<TSource, TKey> keySelector,
	IComparer<TKey> comparer
)

Параметры

source
Type: System.Collections.Generic.IEnumerable<TSource>

Последовательность значений, которые следует упорядочить.

keySelector
Type: System.Func<TSource, TKey>

Функция, извлекающая ключ из элемента.

comparer
Type: System.Collections.Generic.IComparer<TKey>

IComparer<T> Для сравнения ключей.

Возвращаемое значение

Type: System.Linq.IOrderedEnumerable<TSource>

IOrderedEnumerable<TElement> Элементы которой сортируются в порядке убывания ключа.

Параметры типа

TSource

Тип элементов source.

TKey

Тип ключа, возвращаемого функцией keySelector.

Exception Condition
ArgumentNullException

Параметр source или keySelector имеет значение null.

Этот метод реализуется с использованием отложенного выполнения. Немедленно возвращаемое значение — это объект, который хранит все сведения, необходимые для выполнения действия. Запрос, представленный данным методом не выполняется до перечисления объекта путем непосредственного вызова его GetEnumerator метода или с помощью foreach в Visual C# или For Each в Visual Basic.

Для упорядочения последовательности по значениям сами элементы, укажите функции identity (x => x в Visual C# или Function(x) x в Visual Basic) для keySelector.

Расширить тип определены два метода IOrderedEnumerable<TElement>, который является типом возвращаемого значения этого метода. Эти два метода, а именно ThenBy и ThenByDescending, позволяют указать дополнительные условия сортировки для сортировки последовательности. ThenBy и ThenByDescending также возвращают IOrderedEnumerable<TElement>, что означает любое количество последовательных вызовов ThenBy или ThenByDescending можно сделать.

System_CAPS_noteПримечание

Поскольку IOrderedEnumerable<TElement> наследует от IEnumerable<T>, можно вызвать OrderBy или OrderByDescending по результатам вызова OrderBy, OrderByDescending, ThenBy или ThenByDescending. В результате устанавливается новый базовый порядок сортировки, игнорирует ранее заданный порядок.

Если comparer является null, компаратор по умолчанию Default используется для сравнения ключей.

Этот метод выполняет строгую сортировку; то есть если ключи двух элементов равны, порядок элементов сохраняется. Напротив нестрогой сортировкой не сохраняет порядок элементов, имеющих тот же ключ.

В следующем примере кода демонстрируется использование OrderByDescending<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>) для сортировки элементов последовательности в порядке убывания с использованием функции преобразования и пользовательского блока сравнения.

/// <summary>
/// This IComparer class sorts by the fractional part of the decimal number.
/// </summary>
public class SpecialComparer : IComparer<decimal>
{
    /// <summary>
    /// Compare two decimal numbers by their fractional parts.
    /// </summary>
    /// <param name="d1">The first decimal to compare.</param>
    /// <param name="d2">The second decimal to compare.</param>
    /// <returns>1 if the first decimal's fractional part 
    /// is greater than the second decimal's fractional part,
    /// -1 if the first decimal's fractional
    /// part is less than the second decimal's fractional part,
    /// or the result of calling Decimal.Compare()
    /// if the fractional parts are equal.</returns>
    public int Compare(decimal d1, decimal d2)
    {
        decimal fractional1, fractional2;

        // Get the fractional part of the first number.
        try
        {
            fractional1 = decimal.Remainder(d1, decimal.Floor(d1));
        }
        catch (DivideByZeroException)
        {
            fractional1 = d1;
        }
        // Get the fractional part of the second number.
        try
        {
            fractional2 = decimal.Remainder(d2, decimal.Floor(d2));
        }
        catch (DivideByZeroException)
        {
            fractional2 = d2;
        }

        if (fractional1 == fractional2)
            return Decimal.Compare(d1, d2);
        else if (fractional1 > fractional2)
            return 1;
        else
            return -1;
    }
}

public static void OrderByDescendingEx1()
{
    List<decimal> decimals =
        new List<decimal> { 6.2m, 8.3m, 0.5m, 1.3m, 6.3m, 9.7m };

    IEnumerable<decimal> query =
        decimals.OrderByDescending(num =>
                                       num, new SpecialComparer());

    foreach (decimal num in query)
    {
        Console.WriteLine(num);
    }
}

/*
 This code produces the following output:

 9.7
 0.5
 8.3
 6.3
 1.3
 6.2
*/

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 3.5
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1
Вернуться в начало
Показ: