que sugieren escribir su propio método de extensión (editado para ser genérico con una restricción IComparable<T>
.)
public static int MaxIndex<T>(this IEnumerable<T> sequence)
where T : IComparable<T>
{
int maxIndex = -1;
T maxValue = default(T); // Immediately overwritten anyway
int index = 0;
foreach (T value in sequence)
{
if (value.CompareTo(maxValue) > 0 || maxIndex == -1)
{
maxIndex = index;
maxValue = value;
}
index++;
}
return maxIndex;
}
Tenga en cuenta que esto devuelve -1 si la secuencia está vacía.
Una palabra de las características:
- Esto funciona con una secuencia que sólo se pueden enumerar una vez - esto a veces puede ser muy importante, y es generalmente una característica deseable de la OMI.
- La complejidad de memoria es O (1) (a diferencia de O (n) para la clasificación)
- La complejidad de tiempo de ejecución es O (n) (a diferencia de O (n log n) para la clasificación)
En cuanto a si esto "es LINQ" o no: si se hubiera incluido como uno de los operadores de consulta LINQ estándar, ¿lo considerarías como LINQ? ¿Se siente particularmente extraño o diferente de otros operadores LINQ? Si MS lo incluyera en .NET 4.0 como un nuevo operador, ¿sería LINQ?
EDIT: Si usted es muy, muy empeñado en el uso de LINQ (en lugar de conseguir una solución elegante), entonces aquí es una que todavía es O (n) y sólo evalúa la secuencia de una vez:
int maxIndex = -1;
int index=0;
double maxValue = 0;
int urgh = sequence.Select(value => {
if (maxIndex == -1 || value > maxValue)
{
maxIndex = index;
maxValue = value;
}
index++;
return maxIndex;
}).Last();
Es horrible, y no sugiero que lo uses para nada, pero funcionará.
Me pregunto si la gente realmente está buscando esto al buscar esta pregunta? 'System.Array.IndexOf (score, score.Max())' Acabo de ver un desarrollador de Unity usar el siguiente código LINQ para esta sencilla tarea y me quedé cara a cara. –