2009-08-19 11 views
12

Diciamo che abbiamo un'interfaccia utente e in questa interfaccia utente abbiamo un menu a discesa. Questo elenco a discesa è riempito con i valori tradotti di un enum.ordinamento enum per scopo UI

Arco, abbiamo la possibilità di ordinare in base al valore int dell'enumerazione, dal nome dell'enumerazione e dal nome tradotto dell'enumerazione.

Ma cosa succede se vogliamo un ordinamento diverso rispetto ai 3 di cui sopra. come gestire un tale requisito?

+0

Che tipo di ordinamento sarebbe? –

+0

un utile :) tipicamente uno che viene richiesto da un'altra persona che pensa che dovrebbe essere in un modo (diverso dal modo in cui lo sviluppatore imposta i valori int) – karlis

risposta

11

Implementare il proprio IComparer:

using System; 
using System.Collections.Generic; 

namespace test { 
    class Program { 

     enum X { 
      one, 
      two, 
      three, 
      four 
     } 

     class XCompare : IComparer<X> { 
      public int Compare(X x, X y) { 
       // TBA: your criteria here 
       return x.ToString().Length - y.ToString().Length; 
      } 
     } 


     static void Main(string[] args) { 
      List<X> xs = new List<X>((X[])Enum.GetValues(typeof(X))); 
      xs.Sort(new XCompare()); 
      foreach (X x in xs) { 
       Console.WriteLine(x); 
      } 
     } 
    } 
} 
3

IEnumerable<T>.OrderBy(Func<T, TKey>, IComparer<TKey>)

9

È possibile utilizzare l'estensione LINQ OrderBy, ed eseguire qualunque magia confronto che vuoi:

// order by the length of the value 
SomeEnum[] values = (SomeEnum[])Enum.GetValues(typeof(SomeEnum)); 
IEnumerable<SomeEnum> sorted = values.OrderBy(v => v.ToString().Length); 

poi avvolgere le diverse alternative di ordinamento in metodi e richiamare quella giusta in base alle preferenze degli utenti /ingresso.

0

Perhapse si potrebbe creare un metodo di estensione per la classe Enum, in questo modo:

... prima della dichiarazione ...

public enum MyValues { adam, bertil, caesar }; 

... quindi in un metodo ...

MyValues values = MyValues.adam; 
string[] forDatabinding = values.SpecialSort("someOptions"); 

...The extension method... 

public static class Utils 
    { 
     public static string[] SpecialSort(this MyValues theEnum, string someOptions) 
     { 
      //sorting code here; 
     } 
    } 
.210

E si potrebbe aggiungere parametri diversi per il metodo descritto estensione per le diverse opzioni di ordinamento, ecc

1

Ordina FileSystemRights enum utilizzando LINQ e legarsi a WinForms comboBox:

comboBox1.DataSource = ((FileSystemRights[])Enum.GetValues(typeof(FileSystemRights))). 
OrderBy(p => p.ToString()).ToArray();