本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

Enumerable.OrderByDescending<TSource, TKey> 方法 (IEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>)

 

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

命名空间:   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

sourcekeySelectornull

此方法实现通过使用延迟的执行。 最接近的返回值是指存储执行的操作所需的所有信息的对象。 此方法所表示的查询不执行之前调用枚举的对象及其 GetEnumerator 方法直接或通过使用 foreach 中 Visual C# 或 For Each 中 Visual Basic。

若要按顺序排序元素本身的值,请指定 identity 函数 (x => x 中 Visual C# 或 Function(x) x 中 Visual Basic) 为 keySelector

定义两个方法为扩展类型 IOrderedEnumerable<TElement>, ,这是此方法的返回类型。 这两种方法,即 ThenByThenByDescending, ,使您能够指定要对序列进行排序的另一种排序条件。 ThenByThenByDescending 还返回 IOrderedEnumerable<TElement>, ,这意味着任何数量的连续调用到 ThenByThenByDescending 可以进行。

System_CAPS_note说明

因为 IOrderedEnumerable<TElement> 继承自 IEnumerable<T>, ,您可以调用 OrderByOrderByDescending 对的调用结果 OrderBy, ,OrderByDescending, ,ThenByThenByDescending 执行此操作,引入了新的主排序,将忽略以前建立的排序。

如果 comparernull, ,则默认比较器 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 起可用
返回页首
显示: