如何使用嵌套if条件优化方法



你好,我想用许多嵌套的if else来优化这个方法,其中也包括性能方面或结构方面。

在这里,对于我对数据源进行查询的每种情况,我都有许多条件——这是原则。

上面的方法是有效的,但我想知道是否有什么方法可以让它更可读,降低性能成本?

这是我的代码:

if ((inCheckbox != null) && (inCheckbox == "true"))
{
if ((inCheckboxQu != null) && (inCheckboxQu == "true"))
{
if (wordArraySplit.Length > 1)
{
var request = from qu in dataInitial
from p in q.Pannea
where wordArraySplit.All(word => p.Title.Contains(word))
select q;
dataResult = dataResult.Union(request);
}
else
{
var valueArray = wordArraySplit[0];
var query = dataInitial.Where(qu=> qu.Pannea.Any(p => p.Title.Contains(valueArray)));
dataResult = dataResult.Union(query);
}
}
else
{
if (wordArraySplit.Length > 1)
{
dataResult = from qu in dataInitial
from p in qu.Pannea
where wordArraySplit.All(word => p.Title.Contains(word))
select q;
}
else
{
var valueArray = wordArraySplit[0];
dataResult = dataInitial.Where(qu=> qu.Pannea.Any(p => p.Title.Contains(valueArray)));
}
}
}

我认为你专注于错误的事情。虽然分支在指令执行时可能相当慢,但它仍然以时钟周期为单位进行测量。相比之下,我希望linq语句比嵌套的if语句对性能的影响大得多。

性能和可读性往往是相互冲突的要求。虽然在可能的情况下改进两者都很好,但最终你往往被迫选择其中一个。值得注意的是,Linq有一些不错的开销,所以如果性能很重要,那么常规循环通常会更好。

一些具体评论:

  1. (inCheckbox != null) && (inCheckbox == "true")您应该能够只写inCheckbox == "true",因为null != "true"。但是,为什么首先要使用字符串比较而不是布尔值呢
  2. 我认为你不需要对wordArraySplit.Length <= 1案件进行特殊处理。它可能会带来一些小的性能差异,但可能不会太大。如果您不确定,请进行测量
  3. 对我来说,查询看起来是一样的,除了查询后的并集部分,所以您应该能够将查询代码移动到一个单独的方法中,以避免重复

如果你关心性能,首先要测量和分析代码,看看你是否首先有问题,如果有问题,它在哪里。我猜这样的代码会很快,除非列表很大,或者涉及一些数据库访问。

要提高这种类型的检查的性能,通常首先使用最常失败的检查,例如

if test1 and test2: ...

那么test1应该是最经常失败的一个,所以你不必评估test2

为了使其更易于编辑,我通常在不同的函数中编译测试,并返回true或false,并将逻辑保留在主函数中,如下所示:

if functiontest():
#do_something
def functiontest():
if test1 and test2 and test3 and test3:
return True
else:
return False

在你的情况下,你需要两个这样的功能,因为你基本上有4个最后阶段。

伪代码是python风格的

此外,他们还建议制作一本可能组合的词典:可读的嵌套if语句

这应该适用于您:

if ((inCheckbox == null) || (inCheckbox != "true"))
return;
if (wordArraySplit.Length > 1)
{
dataResult = from qu in dataResultInitial
from p in qu.Pannea
where wordArraySplit.All(word => p.Title.Contains(word))
select q;

if ((inCheckboxQu != null) && (inCheckboxQu == "true"))
dataResult = dataResult.Union(request);
}
else
{
var valueArray = wordArraySplit[0];
var query = dataResultIni.Where(qu=> qu.Pannea.Any(p => p.Title.Contains(valueArray)));
if ((inCheckboxQu != null) && (inCheckboxQu == "true"))
dataResult = dataResult.Union(query);
}

我不知道return是否适合你的其他功能。

相关内容

  • 没有找到相关文章

最新更新