2009-08-19 12 views
12

Digamos que tenemos una IU y en esta interfaz de usuario tenemos un menú desplegable. Este menú desplegable se llena con los valores traducidos de una enumeración.sorting enum para el propósito de UI

Bow, tenemos la posibilidad de ordenar por el valor int de la enumeración, por el nombre de la enumeración, y por el nombre traducido de la enumeración.

Pero, ¿y si queremos una clasificación diferente a las 3 mencionadas anteriormente? cómo manejar tal requisito?

+0

¿Qué tipo de clasificación sería? –

+0

a useful :) típicamente uno que es solicitado por otra persona que cree que debería ser de una manera (que no sea la forma en que el desarrollador establece los valores int) – karlis

Respuesta

11

implementar su propio 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

Puede utilizar la extensión de LINQ OrderBy, y realizar cualquier magia comparación desea:

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

luego envolver las diferentes alternativas de clasificación en los métodos, e invocan el más adecuado en base a las preferencias del usuario /entrada.

0

perhapse se podría crear un método de extensión para la clase de enumeración, así:

... primero la declaración ...

public enum MyValues { adam, bertil, caesar }; 

... luego en un método ...

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

Y se podría añadir diferentes parámetros para el métodos de extensión para diferentes opciones de clasificación etc.

1

Ordenar FileSystemRights enumeración utilizando LINQ y se unen a WinForms ComboBox:

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