2017-08-15 60 views
0

我有一个枚举列表,其中包括一个名为默认枚举。c#枚举名称过滤DropDownList而不是值

public enum Fruits { Default = Banana, 
        Banana = 1, 
        Orange = 2, 
        Grapefruit = 3 } 

我需要填充排除默认字段的下拉列表。

Html.DropDownList("fruitSelector", 
       Enum.GetValues(typeof(Fruits)).Cast<Fruits>() 
        .OrderBy(o => o.GetDescription()) 
        .Where(o => o != Fruits.Default) 
        .Select(o => new SelectListItem() {Text = o.GetDescription(), Value = ((int) o).ToString()}), "-- All Fruits --", 
       new {@class = "form-control", @aria_describedby="sizing-addon1"}) 

当我尝试过滤Fruits.Default时,它将删除BOTH默认值和香蕉。我如何做一个过滤器比较,我只删除默认?

[[CORRECTION]]此枚举重复我的问题。我真的不明白其中的差异。

public enum Fruits 
    { 
     Default = Peaches, 
     Peaches = 1, 
     Bananas = 2, 
     Grapefruit = 3, 
     Apple = 101, 
     Watermellon = 102 
    } 

public enum Fruits2 
{ 
    Default = Mangos, 
    Mangos = 1, 
    Dates = 2, 
    Figs = 3, 
    Apples = 101, 
    Limes = 102, 
    Grapes = 103 
} 
+1

上面的代码是否编译?或者你有没有在这里显示的扩展方法?否则'o.GetDescription()'如何编译没有错误? – Sach

+0

https://stackoverflow.com/questions/30467519/about-enum-and-dataannotation –

+0

@Sach雅是一种获取自定义描述注释的方法。你可以排除这一点。 – user1161137

回答

1

我不认为你正在试图做什么是可能的,因为它是。问题是你的Enum结构。的Default

public enum Fruits 
{ 
    Default = Peaches, 
    Peaches = 1, 
    Bananas = 2, 
    Grapefruit = 3, 
    Apple = 101, 
    Watermellon = 102 
} 

你说值是其价值又是1Peaches。基本上是一样的(BPeachesADefault

int B = 1; 
int A = B; 

所以,当我们使用Enum.Parse(),它把两个相同,并挑选第一个值,当你看看下面你就会明白。场景运行下面的代码,与您当前的枚举:

var deflt = Enum.Parse(typeof(Fruits), Fruits.Default.ToString()); 
var peach = Enum.Parse(typeof(Fruits), Fruits.Peaches.ToString()); 
Console.WriteLine(deflt); 
Console.WriteLine(peach); 

输出将是:

默认

默认

您的枚举然后改成这样:

public enum Fruits 
{ 
    Peaches = Default , 
    Default = 1, 
    Bananas = 2, 
    Grapefruit = 3, 
    Apple = 101, 
    Watermellon = 102 
} 

,并再次运行上面的代码两行。您的输出此时将是:

桃子

桃子

也就是说,Parse()挑选首先定义枚举像你这样当有一个平等。

编辑:

上面的解释是不正确稍微,下面由乔治·亚历山大的评论中指出。请参阅他的解释: 由于您在Console.WriteLine中调用Enum.ToString,因此使用Peaches = Default,Default = 1和Default = Peaches,Peaches = 1时的输出会有所不同。如果你看看var deflt,var peach,你会发现它们在这两种情况下都是一样的,它们是按字母顺序排列的第一个名字。


但有一种变通方法。从你最初的代码示例中我收集到的是你需要一个Enums列表,它们的描述和它们的数值,我是否正确?所以,我首先要抓取字符串列表,不包括Default,这很简单。然后遍历字符串列表,并添加到您的SelectListItem类对象列表中。

var res = Enum.GetNames(typeof(Fruits)) 
    .Where(x => x != "Default"); 

List<SelectListItem> list = new List<SelectListItem>(); 
foreach (string fruit in res) 
{ 
    string desc = EnumHelper<Fruits>.GetEnumDescription(fruit); // This is a utility method I use. You can get the description using your extension method. 
    int val = (int)Enum.Parse(typeof(Fruits), fruit); 
    list.Add(new SelectListItem { enumName = fruit, enumDesc = desc, enumVal = val }); 
} 

如果你必须OrderBy,通过Description创建SelectListItem列表,排序它再次后。

+0

当你在'Console'中调用'Enum.ToString'时,你使用'Peaches = Default,Default = 1,'和'Default = Peaches,Peaches = 1' .WriteLine'。如果你看看'var deflt,var peach',你会发现它们在两种情况下都是一样的,它们是**名字是第一个按字母顺序排列的值** –

+0

知道这很有趣!谢谢!我会用这些信息更新我的答案。 – Sach

+0

枚举已经在使用中,不能更改。加上它没有太大的意义,改变枚举的方式..使用默认的原因,我相信在现有的代码是有一个简单的方法来更改默认,如果需要。但现有值的价值不能改变。所以使桃子=默认,是一个很大的差异比说默认=桃子。因此,除了使用您的解决方法之外,没有办法完成这项工作?嗯 – user1161137

0

你应该把他们的名字比较枚举值,因为DefaultBanana是相等的。所以只要尝试检索名称,过滤它们并将它们解析为值。

var res = Enum.GetNames(typeof(Fruits)) 
       .Where(o => o != nameof(Fruits.Default)) 
       .Select(o => Enum.Parse(typeof(Fruits), o)) 
       .Cast<Fruits>().ToList(); 

这是你的完整的例子:

Html.DropDownList("fruitSelector", 
      Enum.GetNames(typeof(Fruits)) 
       .Where(o => o != nameof(Fruits.Default)) 
       .Select(o => Enum.Parse(typeof(Fruits), o)).Cast<Fruits>() 
       .OrderBy(o => o.GetDescription()) 
       .Select(o => new SelectListItem() { Text = o.GetDescription(), Value = ((int)o).ToString() }), "-- All Fruits --", 
      new { @class = "form-control", @aria_describedby = "sizing-addon1" }) 
+0

似乎工作在第一枚枚举,我放在...但我注意到,该枚举没有复制我的问题...我添加了第二个枚举是略有不同......但打破了你的解决方案。我真的不明白为什么。 tx为你的帮助 – user1161137

+0

这个解决方案给了苹果,香蕉,柚子,默认,watermellon ......所以桃子不会出现,但默认是。 – user1161137

+0

@ user1161137你第一枚枚举的工作原理是因为''Banane' **按字母顺序排列**'Default',但'Peaches'大于'Default',所以当你试图解析'1'时,Parse返回** lessser按名称价值**。对于第二枚枚举它是'Default' –