将Y或N转换为布尔C#

将Y或N转换为布尔C#,c#,c#-4.0,C#,C# 4.0,为了整洁起见,我在想,是否可以将Y或N抛给一个布尔?像这样的东西 bool theanswer = Convert.ToBoolean(input); 长版本 bool theanswer = false; switch (input) { case "y": theanswer = true; break; case "n": theanswer = false; break } 不,这里面没有内置的 但是,如果希望将默认值设置为false,则可以使用: bool theAns

为了整洁起见,我在想,是否可以将Y或N抛给一个布尔?像这样的东西

bool theanswer = Convert.ToBoolean(input);
长版本

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

不,这里面没有内置的

但是,如果希望将默认值设置为false,则可以使用:

bool theAnswer = (input == "y");
(括号只是为了清楚起见。)

尽管你的问题文本和你所得到的代码不同,但是你可能想考虑使它不区分大小写。一种方法是:

bool theAnswer = "y".Equals(input, StringComparison.OrdinalIgnoreCase);
请注意,使用指定的字符串比较可以避免创建新字符串,这意味着您不需要担心文化问题。。。当然,除非你想进行文化敏感的比较。还要注意,我将文本作为方法调用的“目标”,以避免在
input
null
时引发
NullReferenceException

bool theanswer = input.ToLower() == "y";
bool theanswer = input.Equals("Y", StringComparison.OrdinalIgnoreCase);
或者更安全的版本

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

为字符串创建一个扩展方法,该方法执行与第二个算法中指定的类似的操作,从而清理代码:

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
}
还是这个

bool CastToBoolean(string input)
{
    return input.Equals("Y", StringComparison.OrdinalIgnoreCase);
}

正如乔恩所说,没有什么是天生的。约翰贴的答案给了你一个正确的方法。欲了解更多信息,请访问:

课程计划
{
无效字符串输入(字符串str)
{
字符串[]st1=str.Split(“”);
如果(st1!=null)
{
字符串a=str.Substring(0,1);
字符串b=str.Substring(str.Length-1,1);
如果(
a==“^”和&b==“^”
||a==“{”&&b==“}”
||a==”[“&&b==”]
||a==“”
||a==“(&&b==”)
)
{
控制台。写入(“确定格式正确”);
}
其他的
{
控制台。写入(“对不起,格式不正确…”);
}
}
}
静态void Main(字符串[]参数)
{
乌贝德:;
程序一=新程序();
控制台。写入(“用于退出按N”);
控制台。写入(“\n”);
控制台。写入(“输入您的值…=”;
字符串ub=Console.ReadLine();
如果(ub==“Y”| | ub==“Y”| | ub==“N”| | ub==“N”)
{
控制台。写入(“您想退出吗?”);
字符串ui=Console.ReadLine();
如果(ui==“Y”| ui==“Y”)
{
返回;
}
其他的
{
后藤乌贝德;
}
}
一、字符串输入(ub);
Console.ReadLine();
后藤乌贝德;
}
}

我遇到了同样的问题,但以另一种方式解决了

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;
有一个方便的类来解析各种字符串布尔

/// <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;
        }
    }
}
通过添加参数重载以接受对象,这可能会得到进一步改进。

以下是它的两个较短版本:

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 readonlycollection LOWER_TRUE_VALUES=新字符串[]{“TRUE”、“t”、“1”、“yes”、“y”};
公共静态布尔IsTrue(字符串值)
{
返回值!=null
?较低的真实值。包含(value.Trim().ToLower())
:假;
}
见鬼,如果你想变得很短(很难看),你可以把它折叠成两行,如下所示:

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;
private static readonlycollection LOWER_TRUE_VALUES=新字符串[]{“TRUE”、“t”、“1”、“yes”、“y”};
公共静态bool IsTrue(字符串值)=>value!=无效的LOWER_TRUE_VALUES.Contains(value.Trim().ToLower()):false;

如果字符串不是“y”或“n”,是否希望算法爆炸?我正在考虑尝试捕获异常是的。没有内置的支持。我认为这是因为y/n是本地化信息(是/否),这取决于当前区域性。如果输入为空,则会给您一个错误。最好在“y”上使用等号,因为它不能为null。在比较字符串时,使用.ToLower被认为是不好的做法。更好地使用equals函数。您的方法可能有效,但equals更好。另外,您的代码不会处理为null的iput(当输入为null时,会在ToLower上产生一个null指针)。我想更多地阅读如何形成这些类型的表达式。@Gertjan-请提供一个关于最佳实践的链接,而不是笼统的陈述。根据应用程序的需要,我认为在执行这样一个片段的级别上会出现NullReferenceException。@Joel Etherton:我手头没有源代码,但一般逻辑告诉您,如果不以正确的方式将.ToLowers应用于所有变量,则使用.ToLowers可能会导致严重的错误。FXCop在使用.ToLower时发出警告,并建议使用ToUpper。我不知道equals函数的内部工作原理,但是.ToLower()comparison将创建临时字符串进行比较。因此,可能使用.ToLower(或ToUpper)会导致额外的内存使用。同时,null的处理在函数内部完成,使您自己的代码不那么凌乱。@Joel Etherton-A
NullReferenceException
始终是您代码中的一个bug,因此绝对不应该出现这种情况。如果null无效,则应标记为
ArgumentNullException
或更容易跟踪的合同失败。有没有试过在没有行号的情况下追踪
NullReferenceException
的源代码?扩展方法的使用很好,但可能最好对布尔类(如Int.parse)进行解析。您不能对无法拥有实例的类进行扩展。换句话说,不能对静态类进行扩展。使用StartsWith而不是Equals有什么原因吗?我认为“不太多”可能和“真”一样无效(根据我的回答,我还建议使用StringComparison。如果你要使用
input.ToLower()
,我至少只会调用它一次。)我知道我晚了7年,但你的评论(和代码)是不正确的<代码>输入
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;