2010-05-20 32 views
12

Se podría pensar que habría una manera de usar DirectCast, TryCast, CType, etc, pero todos ellos parecen ahogarse en ella por ejemplo:¿Puede .NET convertir "Sí" y "No" a booleano sin If?

CType("Yes", Boolean) 

Se obtiene:

System.InvalidCastException - Conversión desde la cadena "Sí" al tipo 'Boolean' no es válido.

+1

con switch de los casos;) – Stefan

+0

crean que eres propia estructura :-) – philhobgen

+0

utilizar el operador ternario: p – kennytm

Respuesta

55

Si se piensa en ello, "sí" no puede ser convertido a bool porque es un lenguaje y el contexto cadena específica.

"Sí" no es cierto (especialmente cuando su esposa lo dice ...!). Para cosas así, necesitas convertirlo tú mismo; "Sí" significa "verdad", "mmmm yeeessss" significa "verdad a medias, medio falso, tal vez", etc.

+16

+1 para la esposa y el resto – Jehof

+0

+1 para el comentario de la mujer –

+23

Quiere decir que nos falta un tipo de datos importante WifeBoolean :) –

5

No, pero se podría hacer como:

bool yes = "Yes".equals(yourString);

+0

Genio, ¡simplemente genio! –

2
private static bool GetBool(string condition) 
{ 
    return condition.ToLower() == "yes"; 
} 

GetBool("Yes"); // true 
GetBool("No"); // false 

O otro enfoque utilizando métodos de extensión

public static bool ToBoolean(this string str) 
{ 
    return str.ToLower() == "yes"; 
} 

bool answer = "Yes".ToBoolean(); // true 
bool answer = "AnythingOtherThanYes".ToBoolean(); // false 
+1

Tenga cuidado con la carcasa de su entrada.Tal vez use 'return (condition.ToUpper() ==" YES ")? true: falso; 'en su lugar – ZombieSheep

+0

¡Tienes razón! +1 – sshow

+1

Agregue más booleano Zen a su código: return condition.ToLower() == "yes" – bniwredyc

19

Uso de esta manera, puede definir conversiones desde cualquier cadena que desee, hasta el valor booleano que necesita. 1 es verdadero, 0 es falso, obviamente.
Beneficios: Fácilmente modificado. Puede agregar nuevos alias o eliminarlos muy fácilmente.
Contras: Probablemente llevará más tiempo que un simple si. (Sin embargo, si tiene varias Alises, se ponen peludas)

enum BooleanAliases { 
     Yes = 1, 
     Aye = 1, 
     Cool = 1, 
     Naw = 0, 
     No = 0 
} 
static bool FromString(string str) { 
     return Convert.ToBoolean(Enum.Parse(typeof(BooleanAliases), str)); 
} 
// FromString("Yes") = true 
// FromString("No") = false 
// FromString("Cool") = true 
+0

Si lo quiere culturalmente portable, también puede tener un diccionario con algunos valores, para que pueda configurarlo en tiempo de ejecución. – Rubys

+1

+1, inteligente, fácil de leer, mantenible. – AMissico

+0

LOL, me gusta esta idea sobre ingeniería. – Gqqnbig

1

poco fuera de tema, pero necesitaba una vez para una de mis clases para mostrar 'Sí/No' en lugar de 'Verdadero/Falso 'en una grilla de propiedades, así que he implementado YesNoBooleanConverter derivado de BooleanConverter y decorando mi propiedad con <TypeConverter(GetType(YesNoBooleanConverter))> _ ...

1

No se puede. Sin embargo, se debe utilizar como

bool result = yourstring.ToLower() == "yes"; 
-2
Public Function TrueFalseToYesNo(thisValue As Boolean) As String 
    Try 
     If thisValue Then 
      Return "Yes" 
     Else 
      Return "No" 
     End If 
    Catch ex As Exception 
     Return thisValue.ToString 
    End Try 
End Function 
+2

La pregunta es preguntar cómo convertir '" Sí "'/'" No "' a 'true' /' false', y no al revés. – Pang

Cuestiones relacionadas