Manipulação de valores individuais e múltiplos em métodos C # eficazmente
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.
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.