2010-02-26 13 views
7

Tengo una lista de un objeto que debe ser ordenado dependiendo de tres propiedades diferentes del objeto. Ejemplo listausando Comparer para ordenar IEnumerable en C# por diferentes campos

CLass Object1{ Property1 , Property2, Property3} 

ListObj = IEnumerable<Object1> 

Foreach (item in ListObj){ 

    if (item.Property1 == true) 
     item goes at top of list 
    if(item.Property2 == true) 
     item goes end of list 
    if(item.Property3 == true) 
     item can go anywhere. 
} 

final debe ser objetos con Propiedad1 = true seguido de objetos con Propiedad2 = true seguido de objetos con Propiedad3 = true

+0

En realidad, esto es un poco confuso. Pensé que los artículos con property3 pueden ir a cualquier parte. –

+0

Creo que lo tengo ahora ... Cambié mi respuesta a continuación para reflejar mejor la situación. –

+0

No está claro, porque hay una cuestión de precedencia. El código dice en una dirección (el final de la lista lo reemplaza al principio de la lista), pero sospecho que lo dices de otra manera (el frente de la lista anula el final de la lista) –

Respuesta

7

Por qué no usar LINQ?

var orderedList = 
    ListObj.OrderByDescending(x => x.Property1) 
      .ThenByDescending(x => x.Property2); 
+0

No proporciona la clasificación correcta según lo requerido por el OP. – AxelEckenberger

+1

@Obalix: ¿Cuál es la clasificación correcta indicada por el OP? Indica dos posibilidades ... su código insinúa una posibilidad, mientras que el texto después de su código indica otra. Y, por cierto, cierto viene después de falso con un simple OrderBy. OrderByDescending hace que lo verdadero sea lo primero. –

+0

Tienes razón, lo siento! – AxelEckenberger

4

su propio título ya lo dice todo: aplicar una costumbre IComparer<Object1> y pasarlo al método OrderBy extensión:

var orderedItems = ListObj.OrderBy(obj => obj, customComparer); 
1

Esto debería proporcionar la necesaria clasificación (según el código, no la declaración abajo).

ListObj.Where(x => x.Property1 == true) 
     .Concat(ListObj.Where(x => x.Property1 == false && x.Property2 == false)) 
     .Concat(ListObj.Where(x => x.Property2 == true)); 
2

Usted puede hacer las cosas más ordenado por sí mismo si se define este tipo:

public class ComparisonComparer<T> : IComparer<T> 
    { 
     private readonly Comparison<T> _comparison; 

     public ComparisonComparer(Comparison<T> comparison) 
     { 
      _comparison = comparison; 
     } 

     public int Compare(T x, T y) 
     { 
      return _comparison(x, y); 
     } 
} 

que le permite definir la comparación en línea con la declaración de LINQ utilizando una expresión lambda.

1

creo que desea definir una función de comparación donde puede determinar el rango entre cualquiera de los 2 elementos en la lista.

int CompareObject1(Object1 left, Object1 right) 
    { 
     // TODO: cases where your items are null 

     // compare Property1 values 
     if (left.Property1) 
     { 
      if (right.Property1) 
      { 
       // items at same rank 
       return 0; 
      } 
      else 
      { 
       // left item is higher rank than right 
       return -1; 
      } 
     } 
     else if (right.Property1) 
     { 
      // right item is higher rank than left 
      return 1; 
     } 

     // Property1 doesn't indicate position, move along 
     // TODO: repeat for Property2 

     // Property2 doesn't indicate position, move along 
     // TODO: repeat for Property3 

     // if we get here, no determination can 
     // be made/don't bother to move anything 
     return 0; 
    } 

el valor de retorno indica si el objeto izquierdo o derecho debe tener una clasificación más alta con -1 o 1 (o 0 para preferencia). solo asegúrate de cubrir todas tus condiciones.

entonces usted puede utilizar esto como

List<Object1> foo = new List<Object1>() { <items...> }; 
foo.Sort(CompareObject1); 

si estás lista termina hacia atrás, que probablemente pasó las señales en la función de comparación. sus reglas para ordenar son contradictorias, así que le dejaré ordenar Property2 y Property3.

Cuestiones relacionadas