2010-05-06 13 views
65

Voglio ordinare un elenco di oggetti in C# da molti campi, non solo da uno. Ad esempio, supponiamo Ho una classe denominata X con due attributi, A e B, e ho i seguenti oggetti, in questo ordine:Ordina un elenco (C#) da molti campi?

object1 => A = "a", B = "h"
oggetto2 => a = "a", B = "c"
oggetto3 => a = "b", B = "x"
object4 => a = "b", B = "b"

e voglio ordinare l'elenco per un attributo prima, e quando sono uguali, per elemento B, quindi l'ordine sarebbe:

" "a" c"
"a" "h"
"b" "b"
"b" "x"

Per quanto ne so, il metodo di ordine OrderBy da un parametro.

Domanda: Come posso ordinare un elenco C# da più di un campo?

La ringrazio molto

risposta

201

Uso ThenBy:

Customer.OrderBy(c => c.LastName).ThenBy(c => c.FirstName)

See MSDN: http://msdn.microsoft.com/en-us/library/bb549422.aspx

+1

Questo non li ha ordinati per me? Cosa mi manca? Docs.OrderBy (o => o.AcctNum) .ThenBy (o => o.DocDate); –

+0

È possibile che si stia utilizzando un .net precedente. Controlla questa risposta: http://stackoverflow.com/questions/289010/c-sharp-list-sort-by-x-then-y/289040#289040. –

+1

Per i posteri: OrderBy non ordina la raccolta originale, restituisce un IOrderedEnumerable , quindi è necessario assegnare i risultati di OrderBy a una variabile. per esempio. customers = customers.OrderBy (c => c.Surname) .ThenBy (c.Forename) .ToList(); – CptCoathanger

6

Fai la tua qualcosa di oggetto come

public class MyObject : IComparable 
{ 
    public string a; 
    public string b; 

    virtual public int CompareTo(object obj) 
    { 
     if (obj is MyObject) 
     { 
      var compareObj = (MyObject)obj; 
      if (this.a.CompareTo(compareObj.a) == 0) 
      { 
       // compare second value 
       return this.b.CompareTo(compareObj.b); 
      } 
      return this.a.CompareTo(compareObj.b); 
     } 
     else 
     { 
      throw new ArgumentException("Object is not a MyObject "); 
     } 
    } 
} 

notare, inoltre, che il i ritorni per CompareTo:

http://msdn.microsoft.com/en-us/library/system.icomparable.compareto.aspx

Quindi, se si dispone di un elenco di MyObject, chiamare .Sort() cioè

var objList = new List<MyObject>(); 
objList.Sort(); 
+0

Domanda: Come posso ordinare un elenco C# da più di un campo? SI! –

0

vostro oggetto deve implementare l'interfaccia IComparable.

Con esso la classe diventa una nuova funzione denominata CompareTo(T other). All'interno di questa funzione è possibile effettuare qualsiasi confronto tra l'oggetto corrente e l'altro e restituire un valore intero circa se il primo è maggiore, minore o uguale al secondo.

24

Sì, è possibile farlo specificando il metodo di confronto. Il vantaggio è che l'oggetto ordinato non deve essere IComparable

aListOfObjects.Sort((x, y) => 
    { 
     int result = x.A.CompareTo(y.A); 
     return result != 0 ? result : x.B.CompareTo(y.B); 
    }); 
Problemi correlati