2017-10-12 52 views
1

比方说,我希望我的用户能够基于一个枚举值如何按字母顺序排列枚举而不是int?

我的枚举是这样的排序表:

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

查询看起来是这样的:

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

升序/降序将基于enum int值而不是字母顺序。有没有简单的方法来按字母顺序编程?很显然,我可以在我的Enum类中自己分类,但这可能会成为大枚举的普通工作。

如何我希望它进行排序:

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

什么'context.Example'?它是'IQueryable '?你在使用EntityFramework吗? – haim770

+0

是的,这只是一个假设的例子 –

+0

提供的解决方案是否有效? – mega6382

回答

3

可以使用Enum.GetName方法(或ToString()如果我们可以依赖,这将返回名称):

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

,这也可能如果l.Letter可以返回不同的枚举,则工作。如果它返回一个非枚举,它将会失败。这可能是(不)想要的行为。如果您使用ToString(),则可以根据名称来比较对象。但任何对象(通常)都支持ToString()方法。

例如:

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 } 

话虽这么说,它通常使没有太大意义枚举混合在一起。

3

你可以使用这个片段:

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

尝试以下操作:

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