2017-10-12 4 views
1

Disons que je veux que mon utilisateur de pouvoir trier une table à partir d'une valeur ENUMComment commander enum par ordre alphabétique plutôt que sur int?

Mon ENUM ressemblerait à ceci:

public enum Letter 
{ 
    C= 0, 
    A, 
    B, 
    E, 
    D,    
} 

Une requête pourrait ressembler à ceci:

var letters = from l in context.Example 
        orderby l.Letter 
        select l; 

L'ordre croissant/décroissant sera basé sur la valeur enum int plutôt que sur l'ordre alphabétique. Existe-t-il un moyen facile de le classer par ordre alphabétique? Évidemment, je pourrais le trier moi-même dans ma classe Enum mais cela pourrait devenir un travail banal sur des enums plus importants.

Comment je le veux à trier:

//A  ACTUAL //C 
//B  ACTUAL //A 
//C  ACTUAL //B 
//D  ACTUAL //E 
//E  ACTUAL //D 
+0

Quoi 'context.Example'? Est-il 'IQueryable '? Utilisez-vous EntityFramework? – haim770

+0

Oui, c'était juste un exemple hypothétique –

+0

Est-ce que l'une des solutions fournies a fonctionné? – mega6382

Répondre

3

Vous pouvez utiliser la méthode Enum.GetName (ou ToString() si nous pouvons compter que cela retourne le nom):

var letters = from l in context.Example 
       orderby Enum.GetName(l.Letter.GetType(),l.Letter) 
       select l;

Cela pourrait aussi travailler si le l.Letter peut renvoyer des énumérations différentes. Il échouera cependant s'il renvoie un non-enum. Cela peut être un comportement (non) recherché. Si vous utilisez ToString(), vous comparez les objets en fonction de leur nom. Mais tout objet (normalement) prend en charge une méthode ToString().

Par exemple:

csharp> enum Foo { 
     > A, 
     > B, 
     > C 
     > } 
csharp> enum Bar { 
     > AB, 
     > ZZ, 
     > X 
     > } 
csharp> var l = new object[] {Foo.C,Foo.B,Bar.ZZ,Bar.AB,Bar.X,Foo.A}; 
csharp> from li in l orderby Enum.GetName(li.GetType(),li) select li; 
{ A, AB, B, C, X, ZZ } 

Cela dit, il fait généralement pas beaucoup de sens pour mélanger énumérations ensemble.

3

Vous pouvez utiliser cet extrait:

Letter[] allletters = Enum.GetValues(typeof(Letter)).Cast<Letter>().ToArray(); 
var sortedLetters = allletters.OrderBy(l => l.ToString()); 
0

les opérations suivantes:

Letter[] letters = (Letter[])Enum.GetValues(typeof(Letter)); 
IEnumerable<Letter> sorted = values.OrderBy(v => v.ToString());