2010-09-15 14 views
18

Solo por el bien de la limpieza me preguntaba si es posible emitir Y o N a bool. Algo como esto;Casting Y o N to bool C#

bool theanswer = Convert.ToBoolean(input); 

La versión larga;

bool theanswer = false; 
switch (input) 
{ 
    case "y": theanswer = true; break; 
    case "n": theanswer = false; break 
} 
+2

¿Le gustaría que el algoritmo se active si la cadena no es "y" o "n"? –

+0

Estaba considerando tratar de atrapar la excepción, sí. – wonea

+3

No hay soporte incorporado para esto. Supongo que esto se debe a que y/n es información _localizada_ (sí/no) que depende de la cultura actual. – sisve

Respuesta

41

No, no hay nada integrado en esto.

Sin embargo, dado que usted quiere por defecto en falso, sólo puede utilizar:

bool theAnswer = (input == "y"); 

(El horquillado no es sólo para mayor claridad.)

es posible que desee considerar la posibilidad de que caso nacional insensible sin embargo, dada la diferencia entre el texto de su pregunta y el código que tiene. Una forma de hacer esto:

bool theAnswer = "y".Equals(input, StringComparison.OrdinalIgnoreCase); 

Tenga en cuenta que el uso de la comparación cadena especificada evita la creación de una nueva cadena, y significa que no es necesario que preocuparse por cuestiones culturales ... a menos que desea realizar un cultivo -Composición sensible, por supuesto. También tenga en cuenta que he puesto el literal como el "objetivo" de la llamada al método para evitar que se genere NullReferenceException cuando input es null.

+9

Nice guard contra entrada siendo nulo en el segundo ejemplo. Tengo que recordar eso. – Luc

+0

Gracias por eso, la explicación realmente ayudó. – wonea

+2

(input ?? "") .Equals ("y", StringComparison.OrdinalIgnoreCase); aclara el intento, verificamos el valor de las variables igual a algunas constantes, no al revés. Es el mismo debate C++ de if (NULL == ptr) –

8
bool theanswer = input.ToLower() == "y"; 
+0

El uso de .ToLower se considera una mala práctica al comparar cadenas. Mejor usa la función igual. Tu método podría funcionar, pero igual es mejor. Además, su código no maneja que iput sea nulo (causa un nullpointer en el ToLower cuando la entrada es nula). – Gertjan

+0

cosas brillantes, gracias. Me gustaría leer más sobre cómo formar este tipo de expresiones. – wonea

+1

@Gertjan: proporcione un enlace para considerar las mejores prácticas en lugar de hacer una declaración general. Dependiendo de las necesidades de la aplicación, creo que se esperaría una NullReferenceException en el nivel en que se ejecutaría una pieza como esta. –

4

cómo esto.

bool theanswer = input.Equals("Y", StringComparison.OrdinalIgnoreCase); 

o una versión más segura.

bool theanswer = "Y".Equals(input, StringComparison.OrdinalIgnoreCase); 
+1

Si la entrada es nula, le dará un error. Mejor usa los iguales en "y" ya que eso no puede ser un nulo. – Gertjan

+0

Estoy de acuerdo contigo. –

5

Crear un método de extensión de cadena que hace algo similar a lo que se especifica en el segundo algoritmo, así limpiar su código:

public static bool ToBool(this string input) 
{ 
    // input will never be null, as you cannot call a method on a null object 
    if (input.Equals("y", StringComparison.OrdinalIgnoreCase)) 
    { 
     return true; 
    } 
    else if (input.Equals("n", StringComparison.OrdinalIgnoreCase)) 
    { 
     return false; 
    } 
    else 
    { 
     throw new Exception("The data is not in the correct format."); 
    } 
} 

y llamar al código:

if (aString.ToBool()) 
{ 
    // do something 
} 
+1

Buen uso del método de extensión, pero tal vez es mejor hacer un análisis en la clase booleana (como el Int.Parse). – Gertjan

+1

No puede hacer una extensión de una clase que no puede tener una instancia de ... en otras palabras, no puede tener una extensión a una clase estática. –

+0

¿Alguna razón para usar StartsWith en lugar de Equals? Creo que "no mucho" probablemente sea tan inválido como "verdadero" :) (También recomendaría usar StringComparison, según mi respuesta.Si * va a usar 'input.ToLower()', al menos solo lo llamaría una vez) –

0

¿O esto?

bool CastToBoolean(string input) 
{ 
    return input.Equals("Y", StringComparison.OrdinalIgnoreCase); 
} 
-1
class Program 
{ 
    void StringInput(string str) 
    { 
     string[] st1 = str.Split(' '); 

     if (st1 != null) 
     { 
      string a = str.Substring(0, 1); 
      string b=str.Substring(str.Length-1,1); 

      if(
       a=="^" && b=="^" 
       || a=="{" && b=="}" 
       || a=="[" && b=="]" 
       ||a=="<" && b==">" 
       ||a=="(" && b==")" 
       ) 

      { 
       Console.Write("ok Formate correct"); 
      } 
      else 
      { 
       Console.Write("Sorry incorrect formate..."); 
      } 
     } 
    } 
    static void Main(string[] args) 
    { 
     ubaid: ; 
     Program one = new Program(); 
     Console.Write("For exit Press N "); 
     Console.Write("\n"); 
     Console.Write("Enter your value...="); 
     string ub = Console.ReadLine(); 

     if (ub == "Y" || ub=="y" || ub=="N" || ub=="n") 
     { 
      Console.Write("Are your want to Exit Y/N: "); 
      string ui = Console.ReadLine(); 
      if (ui == "Y" || ui=="y") 
      { 
       return; 
      } 
      else 
      { 
       goto ubaid; 
      } 

     } 
     one.StringInput(ub);   
     Console.ReadLine(); 
     goto ubaid; 
    } 
} 
+0

Mi idea era producir algo pequeño y conciso, este código es demasiado. – wonea

0

que enfrentan el mismo problema, pero resuelto de otra manera.

bool b=true; 
     decimal dec; 
     string CurLine = "";   
     CurLine = sr.ReadLine(); 
     string[] splitArray = CurLine.Split(new Char[] { '=' }); 
     splitArray[1] = splitArray[1].Trim(); 
     if (splitArray[1].Equals("Y") || splitArray[1].Equals("y")) b = true; else b = false; 
     CurChADetails.DesignedProfileRawDataDsty1.Commen.IsPad = b; 
0

DotNetPerls tiene una clase muy útil para analizar diversos Bools cadena.

/// <summary> 
/// Parse strings into true or false bools using relaxed parsing rules 
/// </summary> 
public static class BoolParser 
{ 
    /// <summary> 
    /// Get the boolean value for this string 
    /// </summary> 
    public static bool GetValue(string value) 
    { 
     return IsTrue(value); 
    } 

    /// <summary> 
    /// Determine whether the string is not True 
    /// </summary> 
    public static bool IsFalse(string value) 
    { 
     return !IsTrue(value); 
    } 

    /// <summary> 
    /// Determine whether the string is equal to True 
    /// </summary> 
    public static bool IsTrue(string value) 
    { 
     try 
     { 
      // 1 
      // Avoid exceptions 
      if (value == null) 
      { 
       return false; 
      } 

      // 2 
      // Remove whitespace from string 
      value = value.Trim(); 

      // 3 
      // Lowercase the string 
      value = value.ToLower(); 

      // 4 
      // Check for word true 
      if (value == "true") 
      { 
       return true; 
      } 

      // 5 
      // Check for letter true 
      if (value == "t") 
      { 
       return true; 
      } 

      // 6 
      // Check for one 
      if (value == "1") 
      { 
       return true; 
      } 

      // 7 
      // Check for word yes 
      if (value == "yes") 
      { 
       return true; 
      } 

      // 8 
      // Check for letter yes 
      if (value == "y") 
      { 
       return true; 
      } 

      // 9 
      // It is false 
      return false; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
} 

Es llamado por;

BoolParser.GetValue("true") 
BoolParser.GetValue("1") 
BoolParser.GetValue("0") 

Esto probablemente podría mejorarse añadiendo una sobrecarga de parámetro para aceptar un objeto.

+0

Creo que los dos métodos estáticos se supone que son métodos de extensión como este: public static bool GetValue (** this ** string value) => IsTrue (value); bool estático público IsFalse (** este ** valor de cadena) =>! IsTrue (valor); –

0

Wonea gave an "IsTrue" source example from DotNetPerls. Aquí hay dos versiones más cortas de la misma:

public static bool IsTrue(string value) 
{ 
    // Avoid exceptions 
    if (value == null) 
     return false; 

    // Remove whitespace from string and lowercase it. 
    value = value.Trim().ToLower(); 

    return value == "true" 
     || value == "t" 
     || value == "1" 
     || value == "yes" 
     || value == "y"; 
} 

O:

private static readonly IReadOnlyCollection<string> LOWER_TRUE_VALUES = new string[] { "true", "t", "1", "yes", "y" }; 

public static bool IsTrue(string value) 
{ 
    return value != null 
     ? LOWER_TRUE_VALUES.Contains(value.Trim().ToLower()) 
     : false; 
} 

Heck, si usted desea conseguir real a corto (y feo), puede contraer que reduce a dos líneas como esta:

private static readonly IReadOnlyCollection<string> LOWER_TRUE_VALUES = new string[] { "true", "t", "1", "yes", "y" }; 
public static bool IsTrue(string value) => value != null ? LOWER_TRUE_VALUES.Contains(value.Trim().ToLower()) : false;