2011-10-21 35 views
-5

我有6個設備每隔10秒發送一次數據。 接收這些數據併發送到8個陣列。 第一個是索引。 第二個是小時。 接下來的六個,每個設備都有一個。 經過預定時間後,系統將停止接收數據。 停止後,我需要獲得某些6陣列的最大值,最小值和平均值,並填充另一個陣列。 我需要一個循環,這是怎麼回事?例如, 。 myArray1 [320,18]和myArray2 [8,18]數組中的平均數C#

如何做到這一點:

/*  
//myArray2 [0,0] = MAXIMUM (myArray1 from Here [11,0] to Here myArray1 [17,0]) 
//myArray2 [1,0] = AVERAGE (myArray1 from Here [18,0] to Here myArray1 [24,0]) 
//myArray2 [2,0] = AVERAGE (myArray1 from Here [25,0] to Here myArray1 [75,0]) 
//myArray2 [3,0] = AVERAGE (myArray1 from Here [76,0] to Here myArray1 [180,0]) 
//myArray2 [4,0] = AVERAGE (myArray1 from Here [181,0] to Here myArray1 [320,0]) 
*/ 

問候, ocaccy

回答

3

我假設你只想在多維數組中的特定範圍內達到最大值和平均值。使用擴展方法,這是一個有點複雜,但你可以做這樣的:

var myArray1 = new double[320, 18]; 
var myArray2 = new double[8, 18]; 

int dim2 = myArray1.GetLength(1); 
    myArray2[0, 0] = 
     myArray1.Cast<double>().Select((val, idx) => new { idx, val }).Where(
     x => x.idx % dim2 == 0 && x.idx/dim2 >= 11 && x.idx/dim2 < 18).Max(x => x.val); 
    myArray2[1, 0] = 
     myArray1.Cast<double>().Select((val, idx) => new { idx, val }).Where(
     x => x.idx % dim2 == 0 && x.idx/dim2 >= 18 && x.idx/dim2 < 25).Average(x => x.val); 
// ... 

的缺點是,你將所有元素遍歷所有的時間。因此,如果這是performance critical,我比較建議這樣做的老式方法,在一個通:

myArray2[0, 0] = double.MinValue; 
myArray2[1, 0] = 0; 
for (int i = 0; i < myArray1.GetLength(0) + 1; i++) { 
    if (i >= 11 && i < 18 && myArray1[i, 0] > myArray2[0, 0]) myArray2[0, 0] = myArray1[i, 0]; 
    if (i >= 18 && i < 25) myArray2[1, 0] += myArray1[i, 0]; 
    if (i == 25) myArray2[1, 0] /= Math.Abs(25 - 18); 
    // ... 
} 

而且最後建議:不要把幻數到你的代碼(11,18,25,... ),但爲此使用const。後來沒有人知道25的實際含義。

編輯2:我最終得到了擴展方法解決方案。

+0

謝謝DonAndre。 我有字符串myArray [200,50]; 如何將此字符串myArray [200,50]轉換爲int myArray2 [200,50]? Regards, ocaccy – soushinsha

+0

'int.parse(string)'...你應該得到一本關於C#編程的書。順便說一句,如果這是一種家庭作業,你應該添加作業標籤。 – Andreas