2010-06-25 13 views
11

Tengo un objeto de lista que incluye 3 artículos: parciales, lleno hasta H y O. completa Paralist.sort (clasificación personalizada ...)

estoy vinculante esta lista a un OptionButtonList asp, y está ordenando en orden alfabético. Sin embargo, quiero ordenar la lista como la siguiente:

completa a H, parcial, completa Para O.

¿Cómo puedo lograr esto?

+2

¿Qué es "completa Para H, parcial, completa Para O"?Agregue algún código que tenga hasta ahora, por favor. –

+0

Recuerde aceptar una respuesta si la encontró más útil –

Respuesta

20

Linq es ideal para esto. Incluso podría compilar la secuencia de orden para que se defina sobre la marcha, ya que la ejecución del género no se ejecuta hasta el ToList.

var sortedList = yourList.OrderBy(i => i.FullToH). 
    ThenBy(i => i.Partial). 
    ThenBy(i => i.FullToO).ToList(); 
0

Cree un Comparer para su tipo personalizado (que implementa la interfaz IComparer). A continuación, puede utilizar eso para ordenar la lista:

List<CustomType> list = new List<CustomType>(); 

// Fill list 
list.Sort(new CustomComparer()); 

O si está utilizando una versión más reciente del marco y no es necesario volver a utilizar la lógica de clasificación, se puede utilizar el método IEnumerable<T>.OrderBy().

6

son los elementos que enumeró (FullToHo por ejemplo) sólo las cadenas? Si es así, todo lo que necesita hacer es escribir un método para hacer la comparación y ordenar con ese método.

public int CompareEntries(string left, string right) { 
    const string fullToH = "Full To H"; 
    const string partial = "Partial"; 
    const string fullToO = "Full To O"; 
    if (left == right) { 
    return 0; 
    } else if (left == fullToH) { 
    return -1; 
    } else if (left == fullToO) { 
    return 1; 
    } else if (right == fullToH) { 
    return 1; 
    } else { 
    return -1; 
    } 
} 

list.Sort(CompareEntries); 
3

Suponiendo que su lista no es

List<object> myList = new List<object>(); 

pero en cambio, algo así como

List<MyObjectClass> myList = new List<MyObjectClass>(); 

(donde cada elemento es del mismo tipo de objeto)

que podría hacer esto:

myList.Sort((firstObj, secondObj) => 
    { 
     return firstObj.SomeProperty.CompareTo(secondObj.SomeProperty); 
    } 
); 
9

¡Gracias por la ayuda de todos!

lo hice así:

List<string> sortedList = new List<string>(); 
sortedList = list.OrderBy(i => i.CodeValue == "FullToH").ThenBy(i => i.CodeValue == "Partial").ThenBy(i => i.CodeValue == "FullToO").ToList(); 

Entonces enganchan a la sortedList!

+2

La asignación en la primera línea es innecesaria. Esto es mejor: Lista sortedList = list.OrderBy ..... – oferei

+0

¡Intenté esto, no funciona! –

7

Ok, sé que esto es un par de años, pero tengo una solución alternativa que creo que es más elegante que las soluciones anteriores que los futuros lectores podrían considerar:

en su clase:

static readonly List<String> codeValueSortOrder = new List<String> { 
    "Full To H", 
    "Partial", 
    "Full To O" 
}; 

y en su método:

sortedList = list.OrderBy(i=> codeValueSortOrder.IndexOf(i.CodeValue)); 
+2

Nota: para el código real use 'Dictionary' en lugar de la lista' codeValueSortOrder' para tener O (1) búsqueda y O (n log n) con 'Dictionary [value]' en lugar de O (n^2 log n) con ' List.IndexOf' –

Cuestiones relacionadas