你好,我想用許多嵌套if else的性能方面或結構方面來優化這個方法。
在這里,對于我對資料源進行查詢的每種情況,我都有很多條件,這就是原則。
上述方法有效,但我想知道是否有任何方法可以使其更具可讀性并降低性能成本?
這是我的代碼:
if ((inCheckbox != null) && (inCheckbox == "true"))
{
if ((inCheckboxQu != null) && (inCheckboxQu == "true"))
{
if (wordArraySplit.Length > 1)
{
var request = from qu in dataResultInitial
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 = dataResultIni.Where(qu=> qu.Pannea.Any(p => p.Title.Contains(valueArray)));
dataResult = dataResult.Union(query);
}
}
else
{
if (wordArraySplit.Length > 1)
{
dataResult = from qu in dataResultInitial
from p in qu.Pannea
where wordArraySplit.All(word => p.Title.Contains(word))
select q;
}
else
{
var valueArray = wordArraySplit[0];
dataResult = dataResultInitial.Where(qu=> qu.Pannea.Any(p => p.Title.Contains(valueArray)));
}
}
}
uj5u.com熱心網友回復:
我認為你專注于錯誤的事情。盡管隨著指令的執行,分支可能會相當慢,但它仍然以時鐘周期來衡量。相比之下,我希望 linq 陳述句比嵌套的 if 陳述句具有更大的性能影響。
性能和可讀性通常是相互沖突的要求。雖然在可能的情況下改進兩者都很好,但最終您經常被迫選擇其中之一。值得注意的是,Linq 有一些不錯的開銷,所以如果性能很重要,常規回圈通常會更好。
一些具體評論:
(inCheckbox != null) && (inCheckbox == "true")你應該能夠inCheckbox == "true"從null != "true". 但是,為什么首先使用字串比較而不是布林值?- 我認為你不需要特別處理這個
wordArraySplit.Length <= 1案子。它可能會產生一些小的性能差異,但可能不會太大。如果您不確定,請測量。 - 除了查詢之后的聯合部分外,查詢對我來說看起來相同,因此您應該能夠將查詢代碼移動到單獨的方法中以避免重復。
如果您關心性能,首先要測量和分析代碼,看看是否有問題,如果有問題,問題出在哪里。我的猜測是這樣的代碼會非常快,除非串列很大,或者涉及一些資料庫訪問。
uj5u.com熱心網友回復:
為了提高這種型別的檢查的性能,你通常做的是使用最常首先失敗的檢查,例如
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 陳述句
uj5u.com熱心網友回復:
這應該適合你:
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適合您的其他功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/337231.html
