2010-06-25 1 views
11

Ho un oggetto elenco che comprende 3 articoli: parziale, totale Per H, e Full Per O.list.sort (ordinamento personalizzato ...)

sto vincolante questa lista per un OptionButtonList asp, e lo sta ordinando in ordine alfabetico. Tuttavia, voglio per ordinare l'elenco come la seguente:

completa Per H, parziale, completa Per O.

Come posso fare questo?

+2

ciò che è "pieno Per H, parziale, completa Per O"?Aggiungi del codice che hai fino ad ora per favore. –

+0

Ricordarsi di accettare una risposta se lo si ritiene più utile –

risposta

20

Linq è perfetto per questo. È persino possibile creare la sequenza ordine fino a farla definire al volo poiché l'esecuzione dell'ordinamento non viene eseguita fino allo ToList.

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

Creare un comparatore per il proprio tipo personalizzato (che implementa l'interfaccia IComparer). È quindi possibile utilizzare che per ordinare l'elenco:

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

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

Oppure, se si sta utilizzando una versione più recente del quadro e non hanno bisogno di riutilizzare la logica di ordinamento, è possibile utilizzare il metodo IEnumerable<T>.OrderBy().

6

sono gli elementi che hai elencato (FullToHo per esempio) solo stringhe? Se è così allora tutto ciò che devi fare è scrivere un metodo per fare il confronto e ordinare con quel metodo.

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

Assumendo che la lista non è

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

ma, invece, qualcosa di simile a

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

(dove ogni elemento è dello stesso tipo di oggetto)

si potrebbe fare this:

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

Grazie per l'aiuto di tutti!

ho fatto in questo modo:

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

Poi binded al SortedList!

+2

L'allocazione nella prima riga non è necessaria. Questo è meglio: Lista sortedList = list.OrderBy ..... – oferei

+0

Ho provato questo, non funziona! –

7

Ok, so che questo è un paio di anni, ma non ho una soluzione alternativa che secondo me è più elegante rispetto alle soluzioni di cui sopra che i lettori futuri potrebbe prendere in considerazione:

Nella classe:

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

e nel metodo:

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

Nota: per il codice reale utilizzare 'Dictionary' invece di' codeValueSortOrder' list per avere O (1) search e in generale O (n log n) con 'Dictionary [value]' invece di O (n^2 log n) con ' List.IndexOf' –