繁体   English   中英

如何按字母顺序而不是基于int排序枚举?

[英]How to order enum alphabetically rather than on int?

假设我希望我的用户能够基于枚举值对表进行排序

我的枚举看起来像这样:

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

查询可能如下所示:

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

升序/降序将基于枚举int值而不是字母顺序。 有没有一种简单的方法可以按字母顺序对它进行编程排序? 显然,我可以自己在Enum类中对它进行排序,但这可能会成为对较大枚举的日常工作。

我希望如何对其进行排序:

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

您可以使用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 }

话虽如此,将枚举混合在一起通常没有多大意义。

您可以使用以下代码段:

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

请尝试以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM