F # tiene útil minBy
y maxBy
operadores, que me gusta de implementar como métodos de extensión de C#, ya que la biblioteca de LINQ los omite. Es un poco de trabajo, pero sólo un poco, y que le permite evitar expresiones complejas tales como
var earliest = booList.First(b => b.Field3 == booList.Min(e => e.Field3));
En cambio, puede escribir esto:
var earliest = booList.MinBy(b => b.Field3);
Una aplicación sencilla:
static T MinBy<T, C>(this IEnumerable<T> sequence, Func<T, C> keySelector)
{
bool first = true;
T result = default(T);
C minKey = default(C);
IComparer<C> comparer = Comparer<C>.Default; //or you can pass this in as a parameter
foreach (var item in sequence)
{
if (first)
{
result = item;
minKey = keySelector.Invoke(item);
first = false;
continue;
}
C key = keySelector.Invoke(item);
if (comparer.Compare(key, minKey) < 0)
{
result = item;
minKey = key;
}
}
return result;
}
Esto también es algo más eficiente que el complejo de expresión en la parte superior, ya que MinBy itera la secuencia exactamente una vez, mientras que las iteraciones de expresión más de una vez y de menos de o igual a dos veces. Y, por supuesto, la clasificación y después de tomar el primer elemento requiere de clasificación, que es O (n log n), mientras que esto es sólo O (n).
¡Excelente! Y si usa un campo en particular varias veces para Mín. O Máx., Simplemente agregar una propiedad sería más simple que la implementación de IComparable, que por supuesto solo puede implementarse para un valor –
Para un problema tan simple que ofrece n líneas de código no es bueno, no es óptimo, legible y tampoco está relacionado con la complejidad del problema –
@SaeedAmiri pero el MinBy El método está pensado como un método de biblioteca, en otra clase, simplificando muchos códigos de cliente a expensas de crear un método separado y más complejo. Es por eso que tenemos métodos en primer lugar. Permiten la descomposición, duplicación reducida/reutilización de código , y la ocultación de los detalles de implementación, entre otras ventajas. ¿Cómo es 'var early = booList.MinBy (b => b.Field3);' no legible? – phoog