2017-10-12 55 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()); 
相關問題