2010-05-06 20 views
65

Quiero pedir una Lista de objetos en C# por muchos campos, no solo por uno. Por ejemplo, supongamos que tengo una clase llamada X con dos atributos, A y B, y tengo los siguientes objetos, en este orden:¿Pide una lista (C#) por muchos campos?

objeto1 => A = "A", B = "h"
object2 => a = "a", B = "c"
object3 => a = "b", B = "x"
object4 => a = "b", B = "b"

y quiero ordenar la lista por un atributo en primer lugar, y cuando son iguales, por el elemento B, por lo que el orden sería:

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

Por lo que sé, el orden método OrderBy por un parámetro.

Pregunta: ¿Cómo puedo solicitar una lista de C# en más de un campo?

Muchas gracias

Respuesta

201

Uso ThenBy:

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

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

+1

Esto no los ordenó para mí? ¿Qué me falta? Docs.OrderBy (o => o.AcctNum) . ThenBy (o => o.DocDate); –

+0

Puede estar usando un .net anterior. Verifique esta respuesta: http://stackoverflow.com/questions/289010/c-sharp-list-sort-by-x-then-y/289040#289040. –

+1

Para la posteridad: OrderBy no ordena la colección original, devuelve IOrderedEnumerable , por lo que debe asignar los resultados de OrderBy a una variable. p.ej. customers = customers.OrderBy (c => c.Surname) .ThenBy (c.Forename) .ToList(); – CptCoathanger

6

Haga su objeto algo así como

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 "); 
     } 
    } 
} 

en cuenta también que la retornos para CompareTo:

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

Entonces, si usted tiene una lista de MiObjeto, llame .Sort() es decir

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

Pregunta: ¿Cómo puedo solicitar una lista de C# en más de un campo? ¡SÍ! –

0

Su objeto debe implementar la interfaz IComparable.

Con él, su clase se convierte en una nueva función llamada CompareTo(T other). Dentro de esta función puede hacer cualquier comparación entre el objeto actual y el otro y devolver un valor entero si el primero es mayor, menor o igual que el segundo.

24

Sí, puede hacerlo especificando el método de comparación. La ventaja es que el objeto ordenado no tiene que ser IComparable

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