你好,我想用许多嵌套的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有一些不错的开销,所以如果性能很重要,那么常规循环通常会更好。
一些具体评论:
(inCheckbox != null) && (inCheckbox == "true")
您应该能够只写inCheckbox == "true"
,因为null != "true"
。但是,为什么首先要使用字符串比较而不是布尔值呢- 我认为你不需要对
wordArraySplit.Length <= 1
案件进行特殊处理。它可能会带来一些小的性能差异,但可能不会太大。如果您不确定,请进行测量 - 对我来说,查询看起来是一样的,除了查询后的并集部分,所以您应该能够将查询代码移动到一个单独的方法中,以避免重复
如果你关心性能,首先要测量和分析代码,看看你是否首先有问题,如果有问题,它在哪里。我猜这样的代码会很快,除非列表很大,或者涉及一些数据库访问。
要提高这种类型的检查的性能,通常首先使用最常失败的检查,例如
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
是否适合你的其他功能。