c# - test - Código más corto para calcular la lista min/max en.NET
test dome c# (4)
Me gustaría algo como
int minIndex = list.FindMin(delegate (MyClass a, MyClass b) {returns a.CompareTo(b);});
¿Hay una forma integrada de hacer esto en .NET?
Bueno, si no puede usar .NET 3.5, siempre puede ordenar la lista y luego devolver la lista [0]. Puede que no sea la manera más rápida, pero probablemente sea el código más corto, especialmente si tu clase ya implementa IComparable.
List<SomeClass> list = new List<SomeClass>();
// populate the list
// assume that SomeClass implements IComparable
list.Sort();
return list[0]; // min, or
return list[list.Count - 1]; // max
Esto también asume, por supuesto, que no importa qué artículo devuelva si tiene múltiples artículos que son el mínimo o el máximo.
Si su clase no implementa IComparable, puede pasar un delegado anónimo, algo como esto:
list.Sort(delegate(SomeClass x, SomeClass y) { return string.Compare(x.Name, y.Name); });
Notará que "Todavía estoy en 2": es posible que desee ver LINQBridge . En realidad, esto está dirigido a C # 3.0 y .NET 2.0, pero debería poder usarlo con C # 2.0 y .NET 2.0, solo tendrá que usar el comando long-hand:
MyClass min = Enumerable.Min(list),
max = Enumerable.Max(list);
Por supuesto, será más fácil si puede cambiar a C # 3.0 (aún apuntando a .NET 2.0).
Y si LINQBridge no es una opción, puede implementarlo usted mismo:
static void Main()
{
int[] data = { 3, 5, 1, 5, 5 };
int min = Min(data);
}
static T Min<T>(IEnumerable<T> values)
{
return Min<T>(values, Comparer<T>.Default);
}
static T Min<T>(IEnumerable<T> values, IComparer<T> comparer)
{
bool first = true;
T result = default(T);
foreach(T value in values) {
if(first)
{
result = value;
first = false;
}
else
{
if(comparer.Compare(result, value) > 0)
{
result = value;
}
}
}
return result;
}
Usando Linq tienes las funciones Min () y Max ().
Entonces puede hacer list.AsQueryable().Min();