有没有更好的方法来检查布尔逻辑

时间:2013-05-16 06:13:35

标签: c# xml boolean

我有一个xml文件,所以

<Config>
    <Allowed></Allowed>
</Config>

Allowed标签的读取方式如下:

string isAllowed = (string)xml.Root
                              .Element("Config")
                              .Elements("Allowed")
                              .SingleOrDefault();

isAllowed应该在

时采用默认值true
  1. 标签不存在
  2. 存在但是空的
  3. 除了true,false,yes或no之外还有其他任何值。
  4. 以下是执行此操作的代码:

    if (isAllowed == null)
    {
        DoSomething();
        return true;
    }
    if (isAllowed.Length == 0)
    {
        DoSomething();
        return true;
    }
    if (isAllowed.Length != 0)
    {
        if (isAllowed.ToUpper() != "FALSE" && isAllowed.ToUpper() != "NO")
        {
            DoSomething();
            return true;
        }
    }
    

    必须有更好的方法来做到这一点吗?

2 个答案:

答案 0 :(得分:5)

if (isAllowed == null)
{
    DoSomething();
    return true;
}
if (isAllowed.Length == 0)
{
    DoSomething();
    return true;
}

可替换为:

if (string.IsNullOrEmpty(isAllowed)
{
    DoSomething();
    Return true;
}

但实际上,根据您的标准,我认为string.IsNullOrWhiteSpace(isAllowed)会更合适,因为如果标签的内容为“空”,它将返回true。

此外,您不需要第二次使用以下条件,因为如果条件满足,则第一次返回该函数(短路评估)。这意味着您当前在第二个If块中的语句永远不会被执行。

if (isAllowed.Length != 0)

我的第一直觉就是采取与Jon在答案中所做的相同的方法,重复它没有任何优势。但是,我确实认为这是另一个好的设计,因为你应该引入更多条件很多更清洁:

private static bool Validate(string isAllowed)
{
    var defaultTrueConditions = new[] {"true", "false", "yes", "no"};
    if (string.IsNullOrWhiteSpace(isAllowed) ||
        defaultTrueConditions.Contains(isAllowed, StringComparer.OrdinalIgnoreCase))
    {
        DoSomething();
        return true;
    }
    return false;
}

答案 1 :(得分:1)

听起来你可能会更喜欢这样:

// This deals with the nullity aspect. (The "Yes" is just for clarity - it could
// be any value other than "No" or "False" in some form.)
isAllowed = isAllowed ?? "Yes";

bool isFalse = isAllowed.Equals("No", StringComparison.OrdinalIgnoreCase) ||
               isAllowed.Equals("False", StringComparison.OrdinalIgnoreCase);

return !isFalse;

基本上,您违约到true这一事实意味着,如果您找到了一个元素,那么返回值只应 false得到NoFalse的值,不区分大小写。请注意,我在这里使用了序数匹配 - 您可能想要更改它,例如到CurrentCultureIgnoreCaseInvariantCultureIgnoreCase

不清楚DoSomething方法调用的来源,但无论如何我都会将其分开。写一个 确定适当值的方法,如上所示 - 然后有:

bool allowed = CheckAllowed(doc);
if (allowed)
{
    DoSomething();
}
// And use allowed here too

这让我的思绪更加清晰。