2009-08-19 9 views
12

Dites que nous avons une interface utilisateur et dans cette interface utilisateur, nous avons une liste déroulante. Cette liste déroulante est remplie avec les valeurs traduites d'une énumération.tri enum pour UI purpose

Bow, nous avons la possibilité de trier par la valeur int de l'enum, par le nom de l'enum, et par le nom traduit de l'enum. Mais si nous voulons un tri différent des 3 mentionnés ci-dessus. comment gérer une telle exigence?

+0

Quel genre de tri serait-ce? –

+0

un utile :) typiquement celui qui est demandé par une autre personne qui pense qu'il devrait être dans un sens (autre que la façon dont le développeur a mis les valeurs int) – karlis

Répondre

11

Mettre en oeuvre votre propre 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

Vous pouvez utiliser l'extension LINQ OrderBy et effectuer quelle que soit la magie comparaison que vous voulez:

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

envelopper ensuite les différentes alternatives de tri dans les méthodes, et invoquez la bonne en fonction des préférences de l'utilisateur /contribution.

0

Perhapse vous pouvez créer une méthode d'extension pour la classe Enum, comme ceci:

... d'abord la déclaration ...

public enum MyValues { adam, bertil, caesar }; 

... puis dans une méthode ...

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

Et vous pouvez ajouter différents paramètres à l'extension metod pour les différentes options de tri etc.

1

Trier FileSystemRights ENUM LINQ et se lier à WinForms comboBox:

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