2017-08-15 30 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' –