2012-07-16 26 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) 
    { 

    } 
} 

quando lo uso .Equals è di riferimento confrontare e quando uso == significa valore confrontare.come confrontare stringa con enum in C#

Esiste un codice migliore invece di convertire il valore enum in ToString() per il confronto? perché distrugge lo scopo del valore tipo enum e anche, ToString() su enum è deprecato ??

+3

Come mai si sta confrontando stringhe Enum valori? C'è un modo per evitarlo completamente? – dlev

+0

Provare a confrontare un'enumerazione con una stringa è un'idea BAD. –

risposta

15

È possibile analizzare il valore di stringa ed eseguire confronti enum.

Enum.TryParse: Vedere 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 */ 
} 

Se sono solo confrontando un unico valore:

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

@Downvoter. Perché il downvote? –

+0

È stato un errore e ora non posso rifarlo finché non modifichi la risposta. Scusate. – Kenci

+3

@Kenci. Ah ok. Ho fatto una modifica. :) –

42

È possibile utilizzare il metodo Enum.TryParse() per convertire una stringa al valore enumerato equivalente (ammesso che esista):

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

Questo è di gran lunga migliore rispetto al confronto del valore 'ToString()' di ciascuna delle enumerazioni. :) –

1

Penso che stai cercando il metodo Enum.Parse() .

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

} 
3

Se si utilizza .NET4 o successivo, è possibile utilizzare Enum.TryParse. e Enum.Parse è disponibile per .NET2 e successivamente

// .NET2 and later 
try 
{ 
    switch (Enum.Parse(typeof(Names), myName)) 
    { 
     case John: ... 
     case Peter: ... 
    } 
} 

// .NET4 and later 
Name name; 
if (Enum.TryParse(myName, out name)) 
    switch (name) 
    { 
     case John: ... 
     case Peter: ... 
    } 
0

Per qualche ragione, le soluzioni indicate non hanno fatto allenamento per me. Ho dovuto fare in un modo leggermente diverso:

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

Speranza che aiuta qualcuno :)