2012-07-16 114 views
32
string strName = "John"; 
public enum Name { John,Peter } 

private void DoSomething(string myname) 
{ 
case1: 
    if(myname.Equals(Name.John) //returns false 
    { 

    } 

case2: 
    if(myname == Name.John) //compilation error 
    { 

    } 

case3: 
    if(myname.Equals(Name.John.ToString()) //returns true (correct comparision) 
    { 

    } 
} 

當我使用.Equals它是參考比較,當我使用==它意味着價值比較。如何比較字符串與枚舉在C#

是否有更好的代碼,而不是將枚舉值轉換爲ToString()進行比較?因爲它破壞了值類型枚舉的目的,並且ToString()上的枚舉也被棄用了?

+3

你怎麼會在比較字符串枚舉值?有沒有辦法完全避免這種情況? – dlev 2012-07-16 16:51:35

+0

試圖比較枚舉與字符串是一個壞主意。 – 2012-07-16 17:45:33

回答

15

您可以解析字符串值並進行枚舉比較。

Enum.TryParse:見http://msdn.microsoft.com/en-us/library/dd783499.aspx

Name result; 
if (Enum.TryParse(myname, out result)) 
{ 
    switch (result) 
    { 
     case Name.John: 
      /* do 'John' logic */ 
      break; 
     default: 
      /* unexpected/unspecialized enum value, do general logic */ 
      break; 
    } 
} 
else 
{ 
    /* invalid enum value, handle */ 
} 

如果你只是比較單個值:

Name result; 
if (Enum.TryParse(myname, out result) && result == Name.John) 
{ 
    /* do 'John' logic */ 
} 
else 
{ 
    /* do non-'John' logic */ 
} 
+0

@Downvoter。爲什麼downvote? – 2014-12-16 17:41:41

+0

這是一個錯誤,現在我不能重做它,直到你編輯答案。抱歉。 – Kenci 2014-12-19 19:57:39

+3

@Kenci。喔好吧。我做了一個編輯。 :) – 2015-01-07 15:01:53

42

可以使用Enum.TryParse()方法將字符串轉換爲等效枚舉值(假設它存在):

Name myName; 
if (Enum.TryParse(nameString, out myName)) 
{ 
    switch (myName) { case John: ... } 
} 
+0

這比比較每個枚舉的'ToString()'值要好得多。 :) – 2012-07-16 16:55:04

1

我認爲你正在尋找的Enum.Parse()方法。

if(myname.Equals(Enum.Parse(Name.John)) //returns false 
{ 

} 
0

出於某種原因,給出解決方案,也沒有鍛鍊我。我曾在一個性能稍微不同的方式來做到:

Name myName; 
if (Enum.TryParse<Name>(nameString, out myName)) 
{ 
    switch (myName) { case John: ... } 
} 

希望它可以幫助別人:)