Manipulação de valores individuais e múltiplos em métodos C # eficazmente

StackOverflow https://stackoverflow.com/questions/603357

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho um método como:

AverageAndDoSomeMath (Point2)

e gostaria de saber como lidar com:

AverageAndDoSomeMath (Point2) // single
AverageAndDoSomeMath (Point2 collection) // multiple

usando uma única aplicação de preferência.

Para a coleta, eu pretendo usar o tipo IEnumerable para que eu possa passar qualquer tipo de coleção, mas para um único valor, eu não quero quebrar e passá-lo como uma coleção, porque a coleção em si não serve para nada, além de satisfazer o tipo.

A melhor forma de lidar com isso da, maneira mais clara, mais rápida e eficiente?

EDIT: Talvez eu deveria ter escolhido um nome melhor método, mas o método calcula a média de todos os pontos, para 1 valor que não faz sentido, mas pense nisso como que o valor será usado para dizer calcular outro valor, mas o importante é encontrar a média, então eu não posso chamar o 1º método.

Foi útil?

Solução

Eu sei que você disse que não queria envolvê-lo e passá-lo como uma coleção, mas existem duas maneiras que você pode fazer isso com o mínimo de confusão, então eu vou postá-los no caso de você não estava ciente de um .

Você pode usar parâmetros no seu método:

public void Average(params Point2[] points)

após o qual você pode chamá-lo com qualquer número de argumentos, ou com um array:

Average(P1);
Average(P2, P3, P4);
Average(); // this one becomes an empty array in the method

Point[] array = new Point[] { P1, P2, P3, P4 };
Average(array);

Ou alternativamente, você pode usar short sintaxe array para encerrar o seu objeto:

Average({ P1 }); // this is legal C# for making an array with 1 element

EDIT: Depois de ler sua nota, gostaria de sugerir que uma matriz params é a forma mais clara de fazer o que quiser. A única verdadeira desvantagem é que você não pode passar em uma IEnumerable<Point2> (ou outras coleções como um List<Point2>) sem primeiro ToArray() chamado, porque ele só tem matrizes reais.

Outras dicas

escrever dois métodos

  • AverageAndDoSomeMath (ponto Point2)
  • AverageAndDoSomeMath (IEnumerable pontos)

e fazer a 1ª chamada um 2 por envolvê-lo em uma coleção.

public decimal AverageAndDoSomeMath (Point2 point)
{
    return AverageAndSomeMath(new []{point});
}

Eu estou supondo que é o que você já tinha em mente, mas achava que não era a solução correta, certo?

Editar: simplificado o método (graças a Freddy Rios)

a única responsabilidade por método diria seu método só deve fazer uma coisa - calcular a média aritmética - e é isso. No "AndDoSomeOtherMath".

E algo se você olhar para o fórmula para a média, certamente você pode calcular significativa com apenas um ponto. É desvio padrão que exige dois ou mais.

FYI, você pode calcular a média e desvio padrão na mosca sem ter que armazenar todos os valores. É muito mais fácil na memória. John D. Cook tem um grande artigo do blog sobre como fazê-lo para o desvio padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top