2010-09-15 6 views
18

Juste pour le souci de la pureté je me demandais, s'il est possible de jeter Y ou N à un bool? Quelque chose comme ça;Coulée Y ou N à bool C#

bool theanswer = Convert.ToBoolean(input); 

La version longue;

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

Voulez-vous que l'algorithme bombe si la chaîne n'est pas "y" ou "n"? –

+0

Je pensais essayer d'attraper l'exception oui. – wonea

+3

Il n'y a pas de support intégré pour cela. Je présume que cela est dû au fait que l'information sur le site est une information localisée (oui/non) qui dépend de la culture actuelle. – sisve

Répondre

41

Non, il n'y a rien de prévu pour cela.

Cependant, étant donné que vous voulez par défaut à false, vous pouvez simplement utiliser:

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

(Le bracketing il est juste pour plus de clarté.)

Vous voudrez peut-être envisager d'en faire crémerie- insensible cependant, étant donné la différence entre le texte de votre question et le code que vous avez. Une façon de le faire:

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

Notez que l'utilisation de la comparaison de chaîne spécifiée évite la création d'une nouvelle chaîne, et signifie que vous n'avez pas à vous soucier des problèmes culturels ... à moins que vous voulez pour effectuer une culture comparaison sensible, bien sûr. Notez également que j'ai mis le littéral comme "cible" de l'appel de méthode pour éviter NullReferenceException étant levé lorsque input est null.

+9

Belle garde contre l'entrée étant nulle dans le deuxième exemple. Je dois m'en souvenir. – Luc

+0

Merci pour cela, l'explication a vraiment aidé. – wonea

+2

(input ?? "") .Equals ("y", StringComparison.OrdinalIgnoreCase); rend l'intention claire, nous vérifions la valeur des variables égale à certaines constantes et non vice versa. C'est le même débat C++ de if (NULL == ptr) –

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

L'utilisation de .ToLower est considérée comme une mauvaise pratique lors de la comparaison de chaînes. Mieux vaut utiliser la fonction égale. Votre méthode pourrait fonctionner, mais égal est meilleur. Aussi votre code ne gère pas iput étant null (provoque un nullpointer sur le ToLower lorsque l'entrée est nulle). – Gertjan

+0

Des trucs géniaux, merci. Je voudrais faire plus de lecture sur la façon de former ce type d'expressions. – wonea

+1

@Gertjan - S'il vous plaît fournir un lien pour l'examen des meilleures pratiques plutôt que de faire une déclaration générale. Selon les besoins de l'application, je pense qu'une NullReferenceException serait attendue au niveau d'une pièce comme celle-ci serait exécutée. –

4

que se passe-t-il?

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

ou encore une version plus sûre.

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

Si l'entrée est nulle, cela vous donnera une erreur. Mieux vaut utiliser les égales sur "y" car cela ne peut pas être nul. – Gertjan

+0

Je suis d'accord avec vous. –

5

Créer une méthode d'extension pour une chaîne qui fait quelque chose de semblable à ce que vous spécifiez dans le second algorithme, le nettoyage ainsi votre code:

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."); 
    } 
} 

et appelez le code:

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

Joli usage de la méthode d'extension, mais peut-être vaut-il mieux faire une analyse sur la classe booléenne (comme Int.Parse). – Gertjan

+1

Vous ne pouvez pas faire une extension d'une classe que vous ne pouvez pas avoir une instance de .. en d'autres termes, vous ne pouvez pas avoir une extension à une classe statique. –

+0

Une raison d'utiliser StartsWith plutôt que Equals? Je pense que "pas très bien" est probablement tout aussi invalide que "vrai" :) (Je recommanderais aussi d'utiliser StringComparison, selon ma réponse.Si vous * allez * utiliser 'input.ToLower()', je l'appellerais au moins une seule fois.) –

0

Ou cela?

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

Mon idée était de produire quelque chose de petit et concis, ce code est beaucoup trop. – wonea

0

J'ai fait face au même problème, mais résolu autrement.

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 a une classe à portée de main pour analyser divers bools de chaîne.

/// <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; 
     } 
    } 
} 

Appelé par;

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

Ceci pourrait probablement être encore amélioré en ajoutant une surcharge de paramètre pour accepter un objet.

+0

Je crois que les deux méthodes statiques ici sont censées être des méthodes d'extension comme ceci: public static bool GetValue (** this ** string value) => IsTrue (valeur); public static bool IsFalse (** cette valeur de chaîne **) =>! IsTrue (valeur); –

0

Wonea gave an "IsTrue" source example from DotNetPerls. Voici deux versions plus courtes de celui-ci:

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"; 
} 

OU:

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 vous voulez obtenir réel à court (et laid), vous pouvez réduire que jusqu'à deux lignes comme ceci:

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;