我有一些相互之間的回圈。在最內部的回圈中,我計算了以后在回圈之外需要的值。
public class Foo
{
public void Bar()
{
...
double baz;
var i = 0;
while (i < 100)
{
...
var j = 0;
while (j < 100)
{
...
baz = DoSomething(i, j);
j ;
}
i ;
}
//一些更多的計算。helper1和helper2只有。
//需要i和j的最后一個值,我不希望
//再次計算它們。
}
private double DoSomething(int i。int j)?
{
///許多行代碼的復雜計算。
var helper1 = i j;
var helper2 = 2*i j;
baz = helper1 helper2。
return baz。
}
}
選項1:我可以再次計算helper1和helper2,但是這很耗時,而且沒有必要。
選項2:我可以用out傳出這些值。
選項3:我可以創建一個具有靜態屬性的靜態類,并在其中存盤這些值。在回圈 2 中:StaticClass.MoreValues1 = bar;...
所有這三個選項都是不合適的。
這三個選項對我來說似乎都不是好的做法。是否有更好的方法?
多謝
編輯:更新了代碼塊,以使其更加清晰。編輯:在helper1和helper2中添加了i和j的依賴關系
uj5u.com熱心網友回復:
基于編輯和評論:
- "每次呼叫的幫助器都不同。我只需要最后的值。"
- "甚至也只需要最后的 baz。"
我會這樣重構:
public class Foo
{
public void Bar()
{
...
double lastBaz;
int helper1;
int helper2。
var i = 0;
while (i < 100)
{
...
var j = 0;
while (j < 100)
{
...
lastBaz = DoSomething(i, j, out helper1, out helper2) 。
j ;
}
i ;
}
//一些更多的計算。 helper1和helper2只有的計算。
//需要i和j的最后一個值,我不希望
//再次計算它們。
}
private double DoSomething(int i。int j, out int helper1, out int helper2)
{
//很多行代碼都是復雜的計算。
helper1 = i j;
helper2 = 2*i j;
baz = helper1 helper2。
return baz。
}
}
這將是第一步。我可能會再次審視這個問題,看看我是否可以將它調整得更有效(記憶體/執行時間)和可讀。
也許,我會改用一個結構來回傳所有三個值,而不是使用外部引數。
public class Foo
{
public void Bar()
{
...
BazResult lastResult。
var i = 0;
while (i < 100)
{
...
var j = 0;
while (j < 100)
{
...
lastResultz = DoSomething(i, j);
j ;
}
i ;
}
//一些更多的計算。helper1和helper2只有。
//需要i和j的最后一個值,我不希望
///要再次計算它們。
//使用lastResult.Baz。
//使用lastResult.Helper1。
// use lastResult.Helper2
}
private BazResult DoSomething(inti, int j)?
{
//很多行代碼都是復雜的計算。
helper1 = i j;
helper2 = 2*i j;
baz = helper1 helper2。
return new BazResult( baz, helper1, helper2);
}
}
public struct BazResult
{
public readonly double Baz。
public readonly int Helper1;
public readonly int Helper2;
public BazResult(double baz。int h1, int h2)
{
Baz = baz;
Helper1 = h1;
Helper2 = h2;
}
uj5u.com熱心網友回復:
從你的例子來看,你似乎在更糟的情況下會做兩次同樣的作業(重新計算MoreValues1, 2, ...)。這通常不是一個性能問題,因為復雜性(大O)不會改變。選項1很好,但如果你想讓它更干凈,你可以通過使用out來改進,正如你在選項2中已經提到的。選項3也會提高性能,但你的靜態變數在呼叫后將繼續被存盤,并會增加你的應用程式的記憶體使用。只有當外回圈在未來被再次呼叫時,我才會使用這個方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/316195.html
標籤:
