with - sort c# generic list




C#Elenco<> Ordina per x poi y (4)

Simile a List <> OrderBy Ordine alfabetico , vogliamo ordinare per un elemento, quindi un altro. vogliamo raggiungere l'equivalente funzionale di

SELECT * from Table ORDER BY x, y  

Abbiamo una classe che contiene un certo numero di funzioni di ordinamento e non abbiamo problemi di ordinamento per un elemento.
Per esempio:

public class MyClass {
    public int x;
    public int y;
}  

List<MyClass> MyList;

public void SortList() {
    MyList.Sort( MySortingFunction );
}

E abbiamo il seguente elenco:

Unsorted     Sorted(x)     Desired
---------    ---------    ---------
ID   x  y    ID   x  y    ID   x  y
[0]  0  1    [2]  0  2    [0]  0  1
[1]  1  1    [0]  0  1    [2]  0  2
[2]  0  2    [1]  1  1    [1]  1  1
[3]  1  2    [3]  1  2    [3]  1  2

L'ordinamento stabile sarebbe preferibile, ma non richiesto. La soluzione che funziona per .Net 2.0 è la benvenuta.



Ho avuto un problema in cui OrderBy e ThenBy non mi hanno dato il risultato desiderato (o semplicemente non sapevo come usarli correttamente).

Sono andato con una lista. Soluzione come questa.

    var data = (from o in database.Orders Where o.ClientId.Equals(clientId) select new {
    OrderId = o.id,
    OrderDate = o.orderDate,
    OrderBoolean = (SomeClass.SomeFunction(o.orderBoolean) ? 1 : 0)
    });

    data.Sort((o1, o2) => (o2.OrderBoolean.CompareTo(o1.OrderBoolean) != 0
    o2.OrderBoolean.CompareTo(o1.OrderBoolean) : o1.OrderDate.Value.CompareTo(o2.OrderDate.Value)));

Per versioni di .Net in cui è possibile utilizzare LINQ OrderBy e ThenBy (o ThenByDescending se necessario):

using System.Linq;
....
List<SomeClass>() a;
List<SomeClass> b = a.OrderBy(x => x.x).ThenBy(x => x.y).ToList();

Nota: per .Net 2.0 (o se non puoi usare LINQ) vedi Hans Passant rispondere a questa domanda.






sorting