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

    } 
} 

cuando uso .Equals referencia es comparar y cuando uso == que significa valor de comparación.cómo comparar cadena con enum en C#

¿Hay un código mejor en lugar de convertir el valor enum en ToString() para comparar? porque destruye el propósito del tipo de valor enum y también, ToString() en enum está en desuso?

+3

cuerdas ¿Cómo es que se están comparando con los valores ENUM? ¿Hay alguna manera de evitar eso por completo? – dlev

+0

Intentar comparar una enumeración con una cadena es una MALA idea. –

Respuesta

15

Puede analizar el valor de la cadena y hacer comparaciones enum.

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

Si se acaba la comparación de un solo valor:

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

@Downvoter. ¿Por qué downvote? –

+0

Fue un error y ahora no puedo volver a hacerlo hasta que edite la respuesta. Lo siento. – Kenci

+3

@Kenci. Ah ok. He hecho una edición. :) –

42

Usted puede utilizar el método Enum.TryParse() para convertir una cadena en el valor enumerado equivalente (suponiendo que exista):

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

Esto es mucho mejor que comparar el valor 'ToString()' de cada una de las enumeraciones. :) –

1

Creo que usted está buscando el método Enum.Parse() .

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

} 
3

Si usando .NET4 o temprano puede utilizar Enum.TryParse. y Enum.Parse está disponible para .NET2 y más tarde

// .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

Por alguna razón, las soluciones dadas no lo hicieron entrenamiento para mí. Que tenía que hacer de una manera ligeramente diferente:

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

espero que ayude a alguien :)

Cuestiones relacionadas