Enumerable.OrderByDescending 方法

定义

按降序对序列的元素排序。

重载

OrderByDescending<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>)

根据键按降序对序列的元素进行排序。

OrderByDescending<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IComparer<TKey>)

使用指定的比较器按降序对序列的元素排序。

OrderByDescending<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>)

Source:
OrderBy.cs
Source:
OrderBy.cs
Source:
OrderBy.cs

根据键按降序对序列的元素进行排序。

C#
public static System.Linq.IOrderedEnumerable<TSource> OrderByDescending<TSource,TKey> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector);

类型参数

TSource

source 的元素类型。

TKey

keySelector 返回的键的类型。

参数

source
IEnumerable<TSource>

一个要排序的值序列。

keySelector
Func<TSource,TKey>

用于从元素中提取键的函数。

返回

一个 IOrderedEnumerable<TElement>,将根据键按降序对其元素进行排序。

例外

sourcekeySelectornull

注解

此方法通过使用延迟执行来实现。 即时返回值是一个对象,用于存储执行操作所需的所有信息。 在通过直接调用GetEnumerator其方法或通过在 C# For Eachforeach Visual Basic 中使用 来枚举对象之前,不会执行此方法表示的查询。

若要按元素本身的值对序列进行排序,请在 C# 或 Function(x) x Visual Basic keySelector) 中指定标识函数 (x => x

有关此方法的示例,请参阅 OrderByDescending<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IComparer<TKey>)

定义了两种方法来扩展类型 IOrderedEnumerable<TElement>,这是此方法的返回类型。 通过这两种方法(即 ThenByThenByDescending),可以指定其他排序条件来对序列进行排序。 ThenByThenByDescending 还返回 , IOrderedEnumerable<TElement>这意味着可以进行任意数量的连续调用 ThenByThenByDescending

备注

由于 IOrderedEnumerable<TElement> 继承自 IEnumerable<T>,因此可以在对 OrderByOrderByDescendingThenByOrderByDescending 的调用结果上调用 OrderByThenByDescending。 这样做会引入一个新的主排序,该排序会忽略以前建立的排序。

此方法使用默认比较器 Default比较键。

此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。 相反,不稳定排序不会保留具有相同键的元素的顺序。

在查询表达式语法中, orderby descending (C#) 或 Order By Descending (Visual Basic) 子句转换为 的调用 OrderByDescending

另请参阅

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

OrderByDescending<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IComparer<TKey>)

Source:
OrderBy.cs
Source:
OrderBy.cs
Source:
OrderBy.cs

使用指定的比较器按降序对序列的元素排序。

C#
public static System.Linq.IOrderedEnumerable<TSource> OrderByDescending<TSource,TKey> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, System.Collections.Generic.IComparer<TKey> comparer);
C#
public static System.Linq.IOrderedEnumerable<TSource> OrderByDescending<TSource,TKey> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TKey> keySelector, System.Collections.Generic.IComparer<TKey>? comparer);

类型参数

TSource

source 的元素类型。

TKey

keySelector 返回的键的类型。

参数

source
IEnumerable<TSource>

一个要排序的值序列。

keySelector
Func<TSource,TKey>

用于从元素中提取键的函数。

comparer
IComparer<TKey>

用于比较键的 IComparer<T>

返回

一个 IOrderedEnumerable<TElement>,将根据键按降序对其元素进行排序。

例外

sourcekeySelectornull

示例

下面的代码示例演示如何使用 OrderByDescending<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IComparer<TKey>) 转换函数和自定义比较器按降序对序列的元素进行排序。

C#
/// <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
*/

注解

此方法通过使用延迟执行来实现。 即时返回值是一个对象,用于存储执行操作所需的所有信息。 在通过直接调用GetEnumerator其方法或通过在 C# For Eachforeach Visual Basic 中使用 来枚举对象之前,不会执行此方法表示的查询。

若要按元素本身的值对序列进行排序,请在 C# 或 Function(x) x Visual Basic keySelector) 中指定标识函数 (x => x

定义了两种方法来扩展类型 IOrderedEnumerable<TElement>,这是此方法的返回类型。 通过这两种方法(即 ThenByThenByDescending),可以指定其他排序条件来对序列进行排序。 ThenByThenByDescending 还返回 , IOrderedEnumerable<TElement>这意味着可以进行任意数量的连续调用 ThenByThenByDescending

备注

由于 IOrderedEnumerable<TElement> 继承自 IEnumerable<T>,因此可以在对 OrderByOrderByDescendingThenByOrderByDescending 的调用结果上调用 OrderByThenByDescending。 这样做会引入一个新的主排序,该排序会忽略以前建立的排序。

如果 comparernull,则使用默认比较器 Default 来比较键。

此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。 相反,不稳定排序不会保留具有相同键的元素的顺序。

另请参阅

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0