Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

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

 

Data di pubblicazione: ottobre 2016

Ordina in senso decrescente gli elementi di una sequenza usando un operatore di confronto specificato.

Spazio dei nomi:   System.Linq
Assembly:  System.Core (in System.Core.dll)

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

Parametri

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

Sequenza di valori da ordinare.

keySelector
Type: System.Func<TSource, TKey>

Funzione per estrarre una chiave da un elemento.

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

Oggetto IComparer<T> per confrontare le chiavi.

Valore restituito

Type: System.Linq.IOrderedEnumerable<TSource>

Un IOrderedEnumerable<TElement> i cui elementi sono ordinati in ordine decrescente in base a una chiave.

Parametri tipo

TSource

Tipo degli elementi di source.

TKey

Tipo della chiave restituita dall'oggetto keySelector.

Exception Condition
ArgumentNullException

source o keySelector è null.

Questo metodo viene implementato tramite esecuzione posticipata. Il valore restituito immediato è un oggetto che archivia tutte le informazioni necessarie per eseguire l'azione. La query rappresentata da questo metodo non viene eseguita finché l'oggetto viene enumerata chiamando il relativo GetEnumerator metodo direttamente o tramite foreach in Visual C# o For Each in Visual Basic.

Per ordinare una sequenza in base ai valori degli elementi stessi, specificare la funzione identity (x => x in Visual C# o Function(x) x in Visual Basic) per keySelector.

Vengono definiti due metodi per estendere il tipo IOrderedEnumerable<TElement>, ovvero il tipo restituito di questo metodo. Questi due metodi, vale a dire ThenBy e ThenByDescending, consentono di specificare i criteri di ordinamento aggiuntivi per ordinare una sequenza. ThenBy e ThenByDescending restituiscono inoltre un IOrderedEnumerable<TElement>, ovvero un numero qualsiasi di chiamate consecutive per ThenBy o ThenByDescending possibili.

System_CAPS_noteNota

Poiché IOrderedEnumerable<TElement> eredita da IEnumerable<T>, è possibile chiamare OrderBy o OrderByDescending ai risultati di una chiamata a OrderBy, OrderByDescending, ThenBy o ThenByDescending. Tale operazione introduce un nuovo ordinamento primario che ignora l'ordinamento definito in precedenza.

Se comparer è null, l'operatore di confronto Default viene utilizzato per confrontare le chiavi.

Questo metodo esegue un ordinamento stabile; ovvero, se le chiavi di due elementi sono uguali, l'ordine degli elementi viene mantenuto. Ordinamento instabile, invece, non mantiene l'ordine degli elementi che hanno la stessa chiave.

Esempio di codice seguente viene illustrato come utilizzare OrderByDescending<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>) per ordinare gli elementi di una sequenza in ordine decrescente utilizzando una funzione di trasformazione e un operatore di confronto personalizzato.

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

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 3.5
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.0
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: