2009-08-19 12 views
12

Angenommen, wir haben eine Benutzeroberfläche und in dieser Benutzeroberfläche haben wir ein Dropdown. Dieses Dropdown ist mit den übersetzten Werten eines Enums gefüllt.Sortierung Enum für UI Zweck

Bow, wir haben die Möglichkeit, nach dem int-Wert des enum, nach dem Namen enum und nach dem übersetzten Namen des enum zu sortieren.

Aber was, wenn wir eine andere Sortierung wünschen als die oben genannten 3. Wie geht man mit einer solchen Anforderung um?

+0

Welche Sortierung wäre das? –

+0

eine nützliche :) in der Regel eine, die von einer anderen Person angefordert wird, die es in einer Weise sein soll (anders als die Art, wie der Entwickler die Int-Werte festgelegt) – karlis

Antwort

11

Implementieren Sie Ihre eigene 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

können Sie die Linq verwenden Erweiterung OrderBy und führen, was Vergleich Magie Sie wollen:

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

dann die verschiedenen Sortier Alternativen in Methoden wickeln, und das Recht, eine auf Benutzerpräferenzen basiert aufrufen /Eingang.

0

perhapse Sie könnten eine Erweiterungsmethode für die Enum-Klasse, wie folgt erstellen:

... zuerst die Erklärung ...

public enum MyValues { adam, bertil, caesar }; 

... dann in einer Methode ...

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

Und könnten Sie verschiedene Parameter an die Erweiterung metod für verschiedene Sortieroptionen usw.

1

Sortieren FileSystemRights Enum mit Linq hinzufügen und binden an WinForms comboBox:

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