Enumerable.ThenByDescending 方法

定义

按降序对序列中的元素执行后续排序。

重载

ThenByDescending<TSource,TKey>(IOrderedEnumerable<TSource>, Func<TSource,TKey>, IComparer<TKey>)

使用指定的比较器按降序对序列中的元素执行后续排序。

ThenByDescending<TSource,TKey>(IOrderedEnumerable<TSource>, Func<TSource,TKey>)

根据某个键按降序对序列中的元素执行后续排序。

ThenByDescending<TSource,TKey>(IOrderedEnumerable<TSource>, Func<TSource,TKey>, IComparer<TKey>)

使用指定的比较器按降序对序列中的元素执行后续排序。

public:
generic <typename TSource, typename TKey>
[System::Runtime::CompilerServices::Extension]
 static System::Linq::IOrderedEnumerable<TSource> ^ ThenByDescending(System::Linq::IOrderedEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector, System::Collections::Generic::IComparer<TKey> ^ comparer);
public static System.Linq.IOrderedEnumerable<TSource> ThenByDescending<TSource,TKey> (this System.Linq.IOrderedEnumerable<TSource> source, Func<TSource,TKey> keySelector, System.Collections.Generic.IComparer<TKey> comparer);
public static System.Linq.IOrderedEnumerable<TSource> ThenByDescending<TSource,TKey> (this System.Linq.IOrderedEnumerable<TSource> source, Func<TSource,TKey> keySelector, System.Collections.Generic.IComparer<TKey>? comparer);
static member ThenByDescending : System.Linq.IOrderedEnumerable<'Source> * Func<'Source, 'Key> * System.Collections.Generic.IComparer<'Key> -> System.Linq.IOrderedEnumerable<'Source>
<Extension()>
Public Function ThenByDescending(Of TSource, TKey) (source As IOrderedEnumerable(Of TSource), keySelector As Func(Of TSource, TKey), comparer As IComparer(Of TKey)) As IOrderedEnumerable(Of TSource)

类型参数

TSource

source 的元素类型。

TKey

keySelector 返回的键的类型。

参数

source
IOrderedEnumerable<TSource>

一个包含要排序的元素的 IOrderedEnumerable<TElement>

keySelector
Func<TSource,TKey>

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

comparer
IComparer<TKey>

用于比较键的 IComparer<T>

返回

IOrderedEnumerable<TSource>

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

例外

sourcekeySelectornull

示例

下面的代码示例演示如何使用 ThenByDescending<TSource,TKey>(IOrderedEnumerable<TSource>, Func<TSource,TKey>, IComparer<TKey>) 通过自定义比较器以降序对序列中的元素执行二次排序。

public class CaseInsensitiveComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        return string.Compare(x, y, true);
    }
}

public static void ThenByDescendingEx1()
{
    string[] fruits = { "apPLe", "baNanA", "apple", "APple", "orange", "BAnana", "ORANGE", "apPLE" };

    // Sort the strings first ascending by their length and
    // then descending using a custom case insensitive comparer.
    IEnumerable<string> query =
        fruits
        .OrderBy(fruit => fruit.Length)
        .ThenByDescending(fruit => fruit, new CaseInsensitiveComparer());

    foreach (string fruit in query)
    {
        Console.WriteLine(fruit);
    }
}

/*
    This code produces the following output:

    apPLe
    apple
    APple
    apPLE
    orange
    ORANGE
    baNanA
    BAnana
*/
' This class provides a custom implementation of the Compare() method.
Class CaseInsensitiveComparer
    Implements IComparer(Of String)

    Function Compare(ByVal x As String, ByVal y As String) As Integer _
    Implements IComparer(Of String).Compare

        ' Compare values and ignore case.
        Return String.Compare(x, y, True)
    End Function
End Class

Sub ThenByDescendingEx1()
    Dim fruits() As String =
    {"apPLe", "baNanA", "apple", "APple", "orange", "BAnana", "ORANGE", "apPLE"}

    ' Sort the strings first by their length and then 
    ' by using a custom "case insensitive" comparer.
    Dim query As IEnumerable(Of String) =
    fruits _
    .OrderBy(Function(fruit) fruit.Length) _
    .ThenByDescending(Function(fruit) fruit, New CaseInsensitiveComparer())

    ' Display the results.
    Dim output As New System.Text.StringBuilder
    For Each fruit As String In query
        output.AppendLine(fruit)
    Next
    Console.WriteLine(output.ToString())
End Sub

' This code produces the following output:

' apPLe
' apple
' APple
' apPLE
' orange
' ORANGE
' baNanA
' BAnana

注解

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

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

ThenBy 定义 和 ThenByDescending 以扩展类型 IOrderedEnumerable<TElement>,这也是这些方法的返回类型。 此设计使你能够通过应用任意数量的 ThenByThenByDescending 方法来指定多个排序条件。

注意

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

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

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

适用于

ThenByDescending<TSource,TKey>(IOrderedEnumerable<TSource>, Func<TSource,TKey>)

根据某个键按降序对序列中的元素执行后续排序。

public:
generic <typename TSource, typename TKey>
[System::Runtime::CompilerServices::Extension]
 static System::Linq::IOrderedEnumerable<TSource> ^ ThenByDescending(System::Linq::IOrderedEnumerable<TSource> ^ source, Func<TSource, TKey> ^ keySelector);
public static System.Linq.IOrderedEnumerable<TSource> ThenByDescending<TSource,TKey> (this System.Linq.IOrderedEnumerable<TSource> source, Func<TSource,TKey> keySelector);
static member ThenByDescending : System.Linq.IOrderedEnumerable<'Source> * Func<'Source, 'Key> -> System.Linq.IOrderedEnumerable<'Source>
<Extension()>
Public Function ThenByDescending(Of TSource, TKey) (source As IOrderedEnumerable(Of TSource), keySelector As Func(Of TSource, TKey)) As IOrderedEnumerable(Of TSource)

类型参数

TSource

source 的元素类型。

TKey

keySelector 返回的键的类型。

参数

source
IOrderedEnumerable<TSource>

一个包含要排序的元素的 IOrderedEnumerable<TElement>

keySelector
Func<TSource,TKey>

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

返回

IOrderedEnumerable<TSource>

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

例外

sourcekeySelectornull

注解

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

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

ThenBy 定义 和 ThenByDescending 以扩展类型 IOrderedEnumerable<TElement>,这也是这些方法的返回类型。 此设计使你能够通过应用任意数量的 ThenByThenByDescending 方法来指定多个排序条件。

注意

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

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

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

在 Visual C# 查询表达式语法中, orderby [first criterion], [second criterion] descending 子句转换为 的 ThenByDescending调用。

在 Visual Basic 查询表达式语法中, Order By [first criterion], [second criterion] Descending 子句转换为 的 ThenByDescending调用。

另请参阅

适用于