如何按字母顺序而不是按int命令枚举?

时间:2017-10-12 20:47:26

标签: c# linq enums

我想说我希望我的用户能够根据枚举值对表进行排序

我的枚举看起来像这样:

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

查询可能如下所示:

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

升序/降序将基于enum int值而不是字母顺序。有没有一种简单的方法按字母顺序以编程方式排序?显然我可以在我的Enum Class中自己排序,但这可能会成为更大的枚举上的平凡工作。

我希望如何排序:

//A       ACTUAL  //C
//B       ACTUAL  //A
//C       ACTUAL  //B
//D       ACTUAL  //E
//E       ACTUAL  //D

3 个答案:

答案 0 :(得分: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 }

话虽如此,将枚举混合在一起通常没什么意义。

答案 1 :(得分:3)

您可以使用此代码段:

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

答案 2 :(得分:0)

尝试以下方法:

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