tengo una lista especializada que contiene elementos de tipo IThing
:C#: Obtener los valores máximo y mínimo de propiedades arbitrarias de todos los elementos de una lista
public class ThingList : IList<IThing>
{...}
public interface IThing
{
Decimal Weight { get; set; }
Decimal Velocity { get; set; }
Decimal Distance { get; set; }
Decimal Age { get; set; }
Decimal AnotherValue { get; set; }
[...even more properties and methods...]
}
A veces necesito saber el máximo o mínimo de un cierto propiedad de todas las cosas en la lista. Debido a "Dime, no preguntes" dejamos que la Lista lo resuelva:
public class ThingList : IList<IThing>
{
public Decimal GetMaximumWeight()
{
Decimal result = 0;
foreach (IThing thing in this) {
result = Math.Max(result, thing.Weight);
}
return result;
}
}
Eso es muy agradable. Pero a veces necesito el peso mínimo, a veces la velocidad máxima y así sucesivamente. No quiero un par GetMaximum*()/GetMinimum*()
para cada propiedad.
Una solución sería la reflexión. Algo así como (taparse la nariz, fuerte olor código!):
Decimal GetMaximum(String propertyName);
Decimal GetMinimum(String propertyName);
¿Hay formas mejores y menos mal olor de lograr esto?
Gracias, Eric
Editar: @ Matt: .Net 2.0
Conclusión: No hay mejor manera para .Net 2.0 (Visual Studio 2005). Tal vez deberíamos pasar a .Net 3.5 y Visual Studio 2008 pronto. Gracias chicos.
Conclusión: Hay formas diferentes que son mucho mejores que la reflexión. Dependiendo del tiempo de ejecución y la versión de C#. Eche un vistazo a la respuesta de Jon Skeets por las diferencias. Todas las respuestas son muy útiles.
Iré por la sugerencia de Sklivvz (métodos anónimos). Hay varios fragmentos de código de otras personas (Konrad Rudolph, Matt Hamilton y Coincoin) que implementan la idea Sklivvz. Solo puedo "aceptar" una respuesta, desafortunadamente.
Muchas gracias. todo lo que puede sentirse "aceptado", Altough sólo se pone Sklivvz los créditos ;-)
He agregado una implementación que funciona – Sklivvz