2014-07-26 89 views
-1

我想在循環前通過複選框選擇我的公式。因爲如果我在循環中選擇公式,代碼工作非常緩慢。所以我應該讓公式變化。以下是一個示例代碼。我怎樣才能做到這一點?循環中的C#變量制定

  formula1 = 2 * a + b; 
      formula2 = 4 * a + 2 * c; 
      formula3= 2 * c + 12 * b + a; 

      if (checkBox1.Checked==true) 
      {formula_select=formula1} 
      if (checkBox2.Checked==true) 
      {formula_select=formula2} 
      if (checkBox3.Checked==true) 
      {formula_select=formula3} 

      for (int i = 1; i < 500000; i++) 
     { 
       a=a+1; 
       b=5 
       c=2; 
       formula_select //for example; formula 2 should be calculated here 
       formula_select* some_numbers; // answer of formula2 should be used here 
       other calculations 
     } 
+0

你能告訴我們將編譯的代碼嗎?我也不明白你想要做什麼。 – gunr2171

+0

您是否試圖選擇基於複選框的數字運行功能? – DavidG

+0

它不清楚你在問什麼 – Rohit

回答

3

要選擇要執行的公式,您可以使用委託。例如:

Func<int, int, int, int> formula_select; 

if (checkBox1.Checked) { 
    formula_select = (a, b, c) => 2 * a + b; 
} else if (checkBox2.Checked) { 
    formula_select = (a, b, c) => 4 * a + 2 * c; 
} else if (checkBox3.Checked) { 
    formula_select = (a, b, c) => 2 * c + 12 * b + a; 
} 

for (int i = 1; i < 500000; i++) { 
    a=a+1; 
    b=5 
    c=2; 
    int x = formula_select(a, b, c); 
    int y = x * some_numbers; 
} 

但是,由於在函數調用中有一些開銷,它可能不會讓它變得更快。不確定它實際上是那些速度慢的代碼部分。你應該儘量簡單的狀態從CheckBox控件存儲在變量和循環使用,這可能是在實際的瓶頸是:

bool check1 = checkBox1.Checked; 
bool check2 = checkBox2.Checked; 
bool check3 = checkBox3.Checked; 

for (int i = 1; i < 500000; i++) { 
    a=a+1; 
    b=5 
    c=2; 

    int x; 
    if (check1) { 
    x = 2 * a + b; 
    } else if (check2) { 
    x = 4 * a + 2 * c; 
    } else if (check3) { 
    x = 2 * c + 12 * b + a; 
    } 

    int y = x * some_numbers; 
} 
+0

謝謝。它控制的速度比3種不同。有沒有什麼東西可以使代碼更快?因爲如果我只使用一個公式(關閉其他公式選項),它的運行速度會更快。 – sonicc34

+0

您可以嘗試從複選框中創建一個整數值,即'int formula = check1? 1:check2? 2:3;',然後在循環中的'switch'中使用它。 – Guffa

+0

再次感謝。我搜索了開關並使用它。現在它工作得更快。 – sonicc34

0

您可以使用預定使用表達式樹編譯lambda表達式,使它更快

代碼段:

表達式>一級方程式=(X,Y,Z)=> 2 * X + Y;

 Expression<Func<int, int, int, int>> formula2 = (x, y, z) => 4 * x + 2 * z; 
     Expression<Func<int, int, int, int>> formula3 = (x, y, z) => 2 * z + 12 * y + x; 


     Func<int, int, int, int> formula_select=null; 
     if (this.formula1.IsChecked.HasValue &&this.formula1.IsChecked.Value) 
     { 
      formula_select = formula1.Compile(); 
     } 
     else if (this.formula2.IsChecked.HasValue&&this.formula2.IsChecked.Value) 
     { 
      formula_select = formula2.Compile(); 
     } 
     else if (this.formula3.IsChecked.HasValue&&this.formula3.IsChecked.Value) 
     { 
      formula_select = formula3.Compile(); 
     } 
     int a=0, b, c,someNumber=1; 
     for (int i = 1; i < 500000; i++) 
    { 
      a=a+1; 
      b=5; 
      c=2; 
      int result=formula_select(a,b,c); 
      int someResult = result * someNumber; 

    }