Pregunta

Tengo un método como:

AverageAndDoSomeMath (Point2)

y me pregunto cómo manejar:

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

utilizando una única implementación preferiblemente.

Para la colección, planeo usar el tipo IEnumerable para poder pasar cualquier tipo de colección, pero por un solo valor, no quiero ajustarlo y pasarlo como una colección, porque la colección en sí no sirve para nada, aparte de satisfacer el tipo.

¿Cómo manejarlo mejor de la manera más clara, rápida y eficiente?

EDITAR: Tal vez debería haber elegido un nombre de método mejor, pero el método calcula el promedio de todos los puntos, para 1 valor no tiene sentido, pero piense que el valor se usará para decir calcular otro valor, pero lo importante es encontrar el promedio, por lo que no puedo llamar al primer método.

¿Fue útil?

Solución

Sé que dijiste que no querías envolverlo y pasarlo como una colección, pero hay dos formas de hacerlo con la mínima molestia, así que los publicaré en caso de que no supieras uno .

Puede usar parámetros en su método:

public void Average(params Point2[] points)

después de lo cual puede llamarlo con cualquier número de argumentos, o con una matriz:

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);

O alternativamente, puede usar una sintaxis de matriz corta para envolver su objeto:

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

EDITAR: Después de leer su nota, sugeriría que una matriz de parámetros es la forma más clara de hacer lo que desea. El único inconveniente real es que no puede pasar una IEnumerable<Point2> (u otras colecciones como una List<Point2>) sin llamar primero a ToArray(), porque solo toma matrices reales.

Otros consejos

Escribir dos métodos

  • AverageAndDoSomeMath (Point2 point)
  • AverageAndDoSomeMath (IEnumerable < Point2 > puntos)

y haga que el primero llame al segundo envolviéndolo en una colección.

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

Supongo que eso es lo que ya tenía en mente, pero pensó que no era la solución correcta, ¿verdad?

Editar: simplificó el método (gracias a Freddy Rios)

una sola responsabilidad por método diría que su método solo debe hacer una cosa: calcular la media aritmética, y eso es todo. No & Quot; AndDoSomeOtherMath & Quot ;.

Y si nos fijamos en la fórmula para la media, ciertamente puede calcular algo significativo con solo un punto. Es la desviación estándar que requiere dos o más.

Para su información, puede calcular una desviación estándar y media sobre la marcha sin tener que almacenar todos los valores. Es mucho más fácil para la memoria. John D. Cook tiene un gran artículo de blog sobre cómo hacerlo para la desviación estándar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top