我有一个xml文件,所以
<Config>
<Allowed></Allowed>
</Config>
Allowed标签的读取方式如下:
string isAllowed = (string)xml.Root
.Element("Config")
.Elements("Allowed")
.SingleOrDefault();
isAllowed应该在
时采用默认值true以下是执行此操作的代码:
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;
}
}
必须有更好的方法来做到这一点吗?
答案 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
得到No
或False
的值,不区分大小写。请注意,我在这里使用了序数匹配 - 您可能想要更改它,例如到CurrentCultureIgnoreCase
或InvariantCultureIgnoreCase
。
不清楚DoSomething
方法调用的来源,但无论如何我都会将其分开。写一个 确定适当值的方法,如上所示 - 然后有:
bool allowed = CheckAllowed(doc);
if (allowed)
{
DoSomething();
}
// And use allowed here too
这让我的思绪更加清晰。