我有点像初学程序员。我在这里要做的是检查是否有时间,是否被选中,以及该时间是否等于另一个。如果这是真的,那么我想跳过它下面的代码块。这是代码示例:
if (currentGVR.Round_Start_Time)
{
if (tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL)
// skip
else
{
key = tr.TransactionID;
TransactionRecords[key]["Start_DateTime"] = roundedStart;
}
}
我考虑过使用OR运算符,但是如果没有时间进行比较,我可以看到错误发生的位置。使用AND运算符可以避免这种困境。
所以整体问题是,是否正确编码否定所有条件以获得正确的结果,例如if(!(cond' s)),并且,在C#中实际比较它之前,这是检查是否有值要比较的最佳方法吗?某些记录中的时间可以为空(或不存在)。有什么建议吗?
答案 0 :(得分:6)
我否定所有这些条件并将&&
切换为||
,以便在代码将(或不会)执行的条件下更快地显现。
另外(根据我的经验),您通常看不到包含if
下所有代码的空else
块。
if (tr.StartLunchDateTime == null || !currentGVR.Round_Start_Lunch || roundedStart != roundedStartL)
{
key = tr.TransactionID;
TransactionRecords[key]["Start_DateTime"] = roundedStart;
}
答案 1 :(得分:3)
声明
if (tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL){
// skip
}
else
{
key = tr.TransactionID;
TransactionRecords[key]["Start_DateTime"] = roundedStart;
}
相当于
if (!(tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL))
{
key = tr.TransactionID;
TransactionRecords[key]["Start_DateTime"] = roundedStart;
}
else {
// skip
}
这可以进一步简化,因为
!(tr.StartLunchDateTime != null &&
currentGVR.Round_Start_Lunch &&
roundedStart == roundedStartL)
与
相同(!(tr.StartLunchDateTime != null) ||
!(currentGVR.Round_Start_Lunch) ||
!(roundedStart == roundedStartL))
或
(tr.StartLunchDateTime == null ||
!currentGVR.Round_Start_Lunch ||
roundedStart != roundedStartL)
请参阅DeMorgan's Laws。
答案 2 :(得分:0)
if (someLongCondition)
{ }
else
{
doStuff();
}
相当于:
if (!someLongCondition)
{
doStuff();
}
所以是的,你可以否定你的整个情况:
if (!(tr.StartLunchDateTime != null && currentGVR.Round_Start_Lunch && roundedStart == roundedStartL))
{ … }
但你也可以在(应用De Morgan's laws)中取消否定并将其写成:
if (tr.StartLunchDateTime == null || !currentGVR.Round_Start_Lunch || roundedStart != roundedStartL)
{ … }
所有这些都是等价的,所以选择任何使条件更清晰的东西(实际上,考虑将它存储在一个单独的变量中,你给出一个描述性名称)。