Pergunta

Eu tenho uma matriz dupla [] segurando muitos números.

Eu tenho um algoritmo que seleciona seções de dentro desta matriz que se enquadram em certas condições (valor maior que x, pelo menos y valores, etc.)

Agora, quero calcular o valor médio de todos esses valores na minha seção.

Então, digamos que minha seção seja do índice 20 a 40. Agora tenho 20 valores. Existe uma maneira fácil de fazer isso em C# ou tenho que dar um loop sobre minha matriz e calcular a média manualmente?

Foi útil?

Solução

var values = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var average = values.Skip(2).Take(5).Average();

Outras dicas

Use Linq:

var myList = new double[] {1,2,3}
var avg = myList.Where(i => i > 1 && i < 2).Avg();

Observe que, se você tiver os números com o índice de 20 a 40, não possui 20 números, terá 21 números.

Você pode usar o método de intervalo para criar um IEnumerable para os índices, e pode usar o método médio para obter a média dos números:

double average = Enumerable.Range(20, 21).Select(i => numbers[i]).Average();
double avg = array
    .Skip(startIndex)
    .Take(endIndex - startIndex + 1)
    .Average();

Usar Enumerável.average:

double[] values = new[] { 1.0, 2.0, 3.14, 2.71, 9.1 };
double average = values.Where(x => x > 2.0 && x < 4.0).Average();

Portanto, para usar isso com seus métodos de seleção, considere que esses métodos retornam IEnumerable<double>. Então, como exemplo:

public IEnumerable<double> GreaterThan(double[] values, double value) {
    for(int i = 0; i < values.Length; i++) {
        if(values[i] > value) {
            yield return values[i];
    }
}

Então:

// values is double[]
double average = GreaterThan(values, 2.0).Average();

Você pode até fazer o método de extensão acima para que ele lê bem:

double average = values.GreaterThan(2.0).Average();

Eu encorajo você a escrever seus métodos de filtragem para retornar IEnumerable<double>.

Você pode usar os métodos de Skip and Take do LINQ para escolher índices específicos:

var myData = new double[] { ..... };
var average = myList.Skip(20).Take(21).Average();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top