Teniendo en cuenta que esta es una tarea muy básica, no se me ocurre una forma adecuada de hacerlo. ¿Cómo obtendría el índice del valor más bajo en una matriz int? Usar Linq/MoreLinq es posible. No pude encontrar una línea razonable hasta ahora.¿Cómo obtendría el índice del valor más bajo en una matriz int?
Respuesta
Ya que mencionas MoreLinq, ¿qué tal:
int[] array = ..
// Will throw if the array is empty.
// If there are duplicate minimum values, the one with the smaller
// index will be chosen.
int minIndex = array.AsSmartEnumerable()
.MinBy(entry => entry.Value)
.Index;
Otra alternativa:
// Will throw if the array is empty.
// Requires two passes over the array.
int minIndex = Array.IndexOf(array, array.Min());
Se podría, por supuesto, escribir su propia extensión método:
// Returns last index of the value that is the minimum.
public static int IndexOfMin(this IEnumerable<int> source)
{
if(source == null)
throw new ArgumentNullException("source");
int minValue = int.MaxValue;
int minIndex = -1;
int index = -1;
foreach(int num in source)
{
index++;
if(num <= minValue)
{
minValue = num;
minIndex = index;
}
}
if(index == -1)
throw new InvalidOperationException("Sequence was empty");
return minIndex;
}
Con un poco de esfuerzo , puede generalizar esto a cualquier tipo aceptando un IComparer<T>
, por defecto a Comparer<T>.Default
.
¿Por qué eligió foreach en el método de extensión? – mafu
En general, no se puede acceder a las secuencias por índice. Usar un 'foreach' es la forma normal de iterar una secuencia arbitraria. Usted * podría * obtener * el enumerador y luego usar un bucle 'for', pero eso se vería bastante desordenado. Si realmente necesita el enumerador, un bucle 'while' es mucho más común. En este caso, ninguno es necesario. – Ani
Vaya, sí, accidentalmente estaba pensando en 'fuente' como una matriz. – mafu
No es muy amigable memoria, pero ...
array.Select((n, i) => new { index = i, value = n })
.OrderBy(item => item.value)
.First().index
También podría reemplazar el OrderBy/First con MinBy. – mafu
@mafutrct: sí, si tienes MoreLinq, lo que haces, pero yo no :) –
Es feo, pero sólo necesita una sola pasada a través de la secuencia y sólo utiliza métodos marco incorporadas:
int index = yourArray.Select((x, i) => new { Val = x, Idx = i })
.Aggregate(new { Val = -1, Idx = -1 },
(a, x) => (x.Idx == 0 || x.Val < a.Val) ? x : a,
x => x.Idx);
Y, por supuesto, puede escribir un método de extensión de propósito general:
int index = yourArray.MinIndex();
// ...
public static class EnumerableExtensions
{
public static int MinIndex<T>(
this IEnumerable<T> source, IComparer<T> comparer = null)
{
if (source == null)
throw new ArgumentNullException("source");
if (comparer == null)
comparer = Comparer<T>.Default;
using (var enumerator = source.GetEnumerator())
{
if (!enumerator.MoveNext())
return -1; // or maybe throw InvalidOperationException
int minIndex = 0;
T minValue = enumerator.Current;
int index = 0;
while (enumerator.MoveNext())
{
index++;
if (comparer.Compare(enumerator.Current, minValue) < 0)
{
minIndex = index;
minValue = enumerator.Current;
}
}
return minIndex;
}
}
}
LINQ probablemente no sea la mejor solución f o este problema, pero aquí hay otra variación que es O (n). No ordena y solo cruza la matriz una vez.
var arr = new int[] { 3, 1, 0, 5 };
int pos = Enumerable.Range(0, arr.Length)
.Aggregate((a, b) => (arr[a] < arr[b]) ? a : b); // returns 2
Actualización: Respondiendo a la pregunta original directamente, esta es la forma en que lo haría:
var arr = new int[] { 3, 1, 0, 5 };
int pos = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] < arr[pos]) { pos = i; }
}
// pos == 2
No, No usa LINQ. Sí, es más de una línea. Pero es realmente simple y realmente rápido. Conviértalo en un pequeño método pequeño y llámelo desde cualquier lugar en una sola línea: pos = FindMinIndex(arr);
- 1. Devuelve el índice del valor más alto en una matriz
- 2. ¿Cómo obtengo el índice del valor más alto en una matriz usando LINQ?
- 3. rendimiento del índice de mayor valor en una matriz
- 4. Encuentra el valor más bajo en un hash
- 5. Buscar el índice de un valor en una matriz
- 6. En Ruby, ¿cuál es la forma más limpia de obtener el índice del valor más grande en una matriz?
- 7. ¿Cómo obtener el valor más común en una matriz Int? (C#)
- 8. ¿Cómo puedo encontrar el índice del valor máximo en una columna de matriz en MATLAB?
- 9. Buscar la clave/índice más alto en una matriz
- 10. Python/Numpy - Encuentre rápidamente el índice en una matriz más cercana a algún valor
- 11. ¿Cómo hacer que MATLAB muestre el índice del valor mínimo en una matriz 2D?
- 12. índice del elemento en una matriz multidimensional
- 13. Buscar el próximo artículo más bajo en una lista ordenada
- 14. valor de índice de matriz
- 15. Java: Encontrar el valor más alto en una matriz
- 16. ¿Valor del índice para la matriz en R?
- 17. Encontrar el más alto, el más bajo, el total, el promedio y la mediana de una matriz en Ruby
- 18. ¿Cómo puedo localizar e imprimir el índice de un valor máximo en una matriz?
- 19. ¿Cómo obtengo el índice de un elemento en una matriz?
- 20. Mayor índice z que aparece debajo del índice z más bajo
- 21. Obtener el índice del elemento de una matriz por el valor
- 22. ¿Encontrando el valor de índice del número más pequeño en una lista?
- 23. Como grupo y seleccione el valor más bajo en SQL
- 24. Encontrar el valor más cercano y volver al índice de matriz en Python
- 25. encontrar el valor mínimo en int matriz con C#
- 26. ¿Cómo obtendría el primer y el último artículo en una cola?
- 27. ¿Cómo obtendría una matriz de puntos de código Unicode de una cadena .NET?
- 28. índice de matriz y el remite mismo valor
- 29. ¿Busca el valor más cercano en una matriz de dobles en C++?
- 30. Valor más alto de una matriz asociativa
¿Puede haber números duplicados en la matriz, y en cuyo caso, qué índice desea mostrar si hay dos de los números más bajos? ? – Paddy
@Paddy Sí duplicados son posibles. Cualquiera de estos está bien para ser devuelto, aunque se apreciará un comportamiento (cualquiera) constante (por ejemplo, siempre el último). – mafu