Приведение Y или N к bool C # - PullRequest
       0

Приведение Y или N к bool C #

18 голосов
/ 15 сентября 2010

Мне просто было интересно, можно ли привести Y или N к типу bool?Примерно так:

bool theanswer = Convert.ToBoolean(input);

Длинная версия;

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

Ответы [ 10 ]

42 голосов
/ 15 сентября 2010

Нет, для этого ничего не встроено.

Однако, учитывая, что вы хотите установить значение по умолчанию false, вы можете просто использовать:

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

(Брекетинг там только для ясности.)

Возможно, вы захотите сделать это без учета регистра, учитывая разницу между текстом вашего вопроса и кодом, который вы получили. Один из способов сделать это:

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

Обратите внимание, что использование указанного сравнения строк позволяет избежать создания новой строки и означает, что вам не нужно беспокоиться о культурных проблемах ... если, конечно, вы не хотите выполнить сравнение с учетом культурных особенностей , Также обратите внимание, что я поместил литерал как «цель» вызова метода, чтобы избежать выброса NullReferenceException, когда input равно null.

8 голосов
/ 15 сентября 2010
bool theanswer = input.ToLower() == "y";
5 голосов
/ 15 сентября 2010

Как предполагает Джон, в этом нет ничего подобного.Ответ, опубликованный Джоном, дает вам правильный способ сделать это.Просто для уточнения вы можете посетить:

http://msdn.microsoft.com/en-us/library/86hw82a3.aspx текст ссылки

5 голосов
/ 15 сентября 2010

Создайте метод расширения для строки, который делает нечто похожее на то, что вы указали во втором алгоритме, таким образом очищая ваш код:

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

и вызывая код:

if (aString.ToBool())
{
     // do something
}
4 голосов
/ 15 сентября 2010

как насчет этого?

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

или еще более безопасная версия.

bool theanswer = "Y".Equals(input, StringComparison.OrdinalIgnoreCase);
0 голосов
/ 24 марта 2017

Вонеа привел пример источника «IsTrue» от DotNetPerls. Вот две его более короткие версии:

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

ИЛИ:

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

Черт,если вы хотите получить очень короткую (и некрасивую) информацию, вы можете свернуть ее до двух строк, например:

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;
0 голосов
/ 25 июля 2016

DotNetPerls имеет удобный класс для разбора различных строковых операторов.

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

Вызывается с помощью;

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

Возможно, это можно еще улучшить, добавивперегрузка параметра для принятия объекта.

0 голосов
/ 23 августа 2014

Я столкнулся с той же проблемой, но решил по-другому.

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 голосов
/ 24 марта 2011
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 голосов
/ 15 сентября 2010

Или это?

bool CastToBoolean(string input)
{
    return input.Equals("Y", StringComparison.OrdinalIgnoreCase);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...