2013-12-18 131 views
5

我對C#相當陌生。我一直在尋找一種簡單的方法來檢查數組中的所有值是否在下限和上限之間,這些對於數組中的每個元素都是不同的。我也對每個數據集運行多個評估。這是我使用的當前方法,這工作正常,但我期待使用更有效的方法。似乎腳踏板方法似乎與我所需要的一致,但我不確定如何使其發揮作用。比較數組或其他方法

最後還有幾個較小的問題由此導致。

我使用的數組通常有20個左右的元素,而不是5個。

列名稱已被更改,以保護無辜...

int x; 
bool failed; 
double [] myArray = new double [5]; 

for(int a = 0;a<= Convert.ToInt32(temp.Compute("Max(Col1)",string.Empty));a++) 
{ 
    failed = false; 

    IEnumerable<DataRow>rows = temp.AsEnumerable() 
            .Where(r=>r.Field<int>("Col1") == a 
            && r.Field<int>("Col2") > 0 
            && r.Field<int>("Col2") < 2000 
            && r.Field<decimal>("Col3") > 0 
            && r.Field<decimal>("Col3") < 1000 
            ); 

    myArray[0] = rows.AsEnumerable().ToList().Count; 
    myArray[1] = rows.AsEnumerable().Sum(row => row.Field<int>("Col4")); 
    myArray[2] = rows.AsEnumerable().Average(row => row.Field<int>("Col4")); 
    myArray[3] = rows.AsEnumerable().Max(row => row.Field<int>("Col5")); 
    myArray[4] = rows.AsEnumerable().Min(row => row.Field<int>("Col5")); 

    //CHECK 1 //////////////////////////////////////// 
    double [] lowerLimit1 = {0,10,0,50000,2}; 
    double[] upperLimit1 = {6000,20,0.75,80000,2}; 
    for(int d = 0;d< myArray.Length;d++) 
    { 
     if(myArray[d] >= lowerLimit1[d] && myArray[d] <= upperLimit1[d]) 
     { 
      x++; 
     }; 
    }; 
    if(x > myArray.Length) 
    { 
     failed = true; 
     dt = rows.CopyToDataTable<DataRow>(); 
    }; 
    //CHECK 2 //////////////////////////////////////// 
    if(! failed) 
    { 
     x = 0; 
     double [] lowerLimit2 = {6000,50,0,30000,2}; 
     double[] upperLimit2 = {6000,10,0.75,50000,2}; 
     for(int d = 0;d< myArray.Length;d++) 
     { 
      if(myArray[d] >= lowerLimit2[d] && myArray[d] <= upperLimit2[d]) 
      { 
       x++; 
      }; 
     }; 
     if(x > myArray.Length) 
     { 
      failed = true; 
      dt = rows.CopyToDataTable<DataRow>(); 
     }; 
    }; 
    //CHECK 3 //////////////////////////////////////// 
    if(! failed) 
    { 
     x = 0; 
     double [] lowerLimit3 = {4000,15,0,50000,2}; 
     double[] upperLimit3 = {5000,20,0.75,80000}; 
     for(int d = 0;d< myArray.Length;d++) 
     { 
      if(myArray[d] >= lowerLimit3[d] && myArray[d] <= upperLimit3[d]) 
      { 
       x++; 
      }; 
     }; 
     if(x > myArray.Length) 
     { 
      failed = true; 
      dt = rows.CopyToDataTable<DataRow>(); 
     }; 
    }; 

}; //END LOOP 
if(failed) 
{ 
    // Do stuff and things 
}; 

也有做而無需重新創建DataRow對象下面的方法?這給出了意想不到的符號'Where'的錯誤。

myArray[4] = rows.AsEnumerable().Min(row => row.Field<int>("Col1") Where row.Field<int>("Col3") == 10); 

我想實現以下,但使用數據錶慢,這就是爲什麼我使用上述方法。

myArray[4] = Convert.ToInt32(temp.Compute("Min(Col1)","Col3 = 10")); 

最後,有沒有辦法重新填充數組沒有一個循環,我已經試過array.Dispose()和陣列= NULL,但他們沒有工作。例如

double [] lowerLimit = {4000,15,0,50000,2}; 
double[] upperLimit = {5000,20,0.75,80000}; 

//重新填充數組,顯然不起作用。

lowerLimit = {6000,50,0,30000,2}; 
upperLimit = {7000,60,0.75,50000,2}; 

比上面的代碼更整潔或者使用多個數組,因爲在使用中通常有20+個元素在數組中。

lowerLimit[0] = 6000, upperLimit[0] = 7000; 
lowerLimit[1] = 50, upperLimit[1] = 60; 
lowerLimit[2] = 0, upperLimit[2] = 0.75; 
lowerLimit[3] = 30000, upperLimit[3] = 50000; 
lowerLimit[4] = 2, upperLimit[4] = 2; 
+1

我不清楚你的問題是什麼。您是否可以嘗試將代碼降低到重現您所遇到的問題以及預期的輸入和輸出所需的最小值? –

+0

嗨,對不起,我感到困惑。上面的代碼沒有問題,我只是尋找一種方法來減少執行任務所需的代碼量,並希望運行代碼所花費的時間,這只是檢查多個值是在upper和下限。我只是真正感興趣的是// Check 1,// Check2等之間的內容,我將其餘內容添加進去,希望能夠理解我正在努力實現的目標。謝謝。 – user3112996

+1

這應該可能會繼續http://codereview.stackexchange.com/ – jessehouwing

回答

0

值檢查可以通過使用All和功能和Enumerable.Range功能的組合來執行。

Enumerable.Range(0,myArray.Length) 
      .All(x => lowerLimit1[x] <= myArray[x] && myArray[x] <= upperLimit[x]); 

如果所有值都在範圍內,則返回true,如果超出範圍,則返回false。

如果你使用它很多創建一個幫助函數之間做。

public static class MyHelperClass { 

    public static bool Between(this double value, double min, double max) { 
     return min <= value && value <= max; 
    } 
} 

然後,你可以做

Enumerable.Range(0,myArray.Length) 
      .All(x => myArray[x].Between(lowerLimit[x], upperLimit[x]); 

替代:

rows.AsEnumerable().Min(row => row.Field<int>("Col1") Where row.Field<int>("Col3") == 10); 

wheremin

rows.AsEnumerable().Where(row => row.Field<int>("Col3") == 10) 
        .Min(row => row.Field<int>("Col1")); 

你只分配一個新的數組,

lowerLimit = new double[] {6000,50,0,30000,2}; 
upperLimit = new double[] {7000,60,0.75,50000,2}; 

在某些情況下,它可以縮短new double[]只是new[]代替,但只有當編譯器是絕對肯定的你意思。

+0

謝謝你的幫助,我認爲這回答了我的問題。 – user3112996