2011-10-21 4 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.

EDIT2: У меня есть решение для расширения, чтобы работать в конечном итоге.

+0

Спасибо, ДонАндре. У меня есть строка myArray [200,50]; Как преобразовать эту строку myArray [200,50] в int myArray2 [200,50]? С уважением, ocaccy – soushinsha

+0

'int.parse (string)' ... вы должны получить книгу по программированию на C#. Кстати, если это была какая-то домашняя работа, вы должны добавить тег домашней работы. – Andreas

2

Если вы хотите среднем массив числовых значений, которые можно использовать Enumerable-х метод расширения http://msdn.microsoft.com/en-us/library/system.linq.enumerable.average.aspx или просто напишите свой простой метод, который суммирует все элементы массива и делит на счет.

+0

Я много узнал о массиве. Танк вас. – soushinsha

Смежные вопросы