In Anbetracht dessen, dass dies eine sehr grundlegende Aufgabe ist, konnte ich mir keinen angemessen einfachen Weg vorstellen, dies zu tun. Wie würden Sie den Index des niedrigsten Wertes in einem int-Array erhalten? Die Verwendung von Linq/MoreLinq ist möglich. Ich konnte bisher keinen vernünftigen Einzeiler finden.Wie erhalten Sie den Index des niedrigsten Wertes in einem int-Array?
Antwort
Da Sie erwähnen MoreLinq, wie etwa:
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;
Eine weitere Alternative:
// Will throw if the array is empty.
// Requires two passes over the array.
int minIndex = Array.IndexOf(array, array.Min());
Sie könnten natürlich Ihre eigene Neben-Methode schreiben:
// 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;
}
Mit einiger Mühe Sie können dies auf einen beliebigen Typ verallgemeinern, indem Sie eine IComparer<T>
akzeptieren, standardmäßig Comparer<T>.Default
.
Warum haben Sie foreach in der Erweiterungsmethode gewählt? – mafu
Im Allgemeinen kann auf Sequenzen nicht per Index zugegriffen werden. Die Verwendung einer 'foreach' ist der normale Weg, um eine beliebige Sequenz zu iterieren. Sie * könnten * den Enumerator bekommen und dann eine 'for'-Schleife benutzen, aber das würde ziemlich unordentlich aussehen. Wenn Sie den Enumerator wirklich brauchen, ist eine while-Schleife viel häufiger. In diesem Fall ist beides nicht notwendig. – Ani
Hoppla, ja, ich habe versehentlich an Source als ein Array gedacht. – mafu
Nicht sehr Speicher freundlich, aber ...
array.Select((n, i) => new { index = i, value = n })
.OrderBy(item => item.value)
.First().index
Sie können OrderBy/First auch durch MinBy ersetzen. – mafu
@mafutrct: yep, wenn Sie MoreLinq haben, was Sie tun, aber ich nicht :) –
Es ist hässlich, aber es braucht nur einen einzigen Durchlauf durch die Sequenz und verwendet nur eingebaute in Rahmen Methoden:
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);
Und, natürlich können Sie eine Universalerweiterungsmethode schreiben:
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 ist wahrscheinlich nicht die beste Lösung f oder dieses Problem, aber hier ist eine andere Variante, die O (n) ist. Es sortiert nicht und durchquert das Array nur einmal.
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
Update: direkt die ursprüngliche Frage zu beantworten, das ist, wie ich es tun würde:
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
Nein, es nicht LINQ verwenden. Ja, es ist mehr als eine Zeile. Aber es ist wirklich einfach und sehr schnell. Machen Sie es zu einer winzigen Methode und rufen Sie es von überall in einer einzigen Zeile an: pos = FindMinIndex(arr);
- 1. Wie den Index des Textes in einem
- 2. Index der niedrigsten Ordnung Bit
- 3. Ermittelt den Index eines Wertes in einem Bash-Array
- 4. Finde den Index eines Wertes in einem Array
- 5. In PANDAS, wie man den Index eines bekannten Wertes erhält?
- 6. Den Index des Teilstrings auf Solaris erhalten
- 7. Was ist in Ruby der sauberste Weg, um den Index des größten Wertes in einem Array zu erhalten?
- 8. So erhalten Sie den Index eines Elements in einem Array
- 9. Erhalten Sie 3 niedrigsten Werte von einem Array, PHP
- 10. Index des Tupelelementtyps erhalten?
- 11. Erhalten Sie den Index des n. Auftretens eines Strings?
- 12. So erhalten Sie den Index des zuletzt ausgewählten Elements in einem Listenfeld
- 13. Wie den Index des Elements von Klasse zu erhalten, die
- 14. Den Index des Artikels von der ID in ExpandableListView erhalten
- 15. Verwendung von INDEX MATCH zum Finden des absolut größten Wertes
- 16. Erhalten Index des Elements in einem Array mit dem Wert
- 17. NSLocalizedString den Schlüssel zurückgeben anstelle des Wertes
- 18. Rückgabe des niedrigsten Index für die ersten nicht Leerzeichen in einem String in Python
- 19. Erhalten tatsächlichen Index während des Einfügens in einem BST
- 20. Wie erhalten Sie den Index und den Maximalwert eines Arrays in einem Schuss?
- 21. BufferedImage - Erhalten des Wertes eines Pixels in Graustufen Farbmodell Bild
- 22. So erhalten Sie die Elementnummer/den Index zwischen den Geschwistern
- 23. Index des aktivierten Tabs erhalten
- 24. den Index des Maximal Element
- 25. Speichern des Wertes des aktivierten Kontrollkästchens in einem Array
- 26. C#: So erhalten Sie den Index des ausgewählten Elements (und den Text) in ListBox
- 27. Finden Sie den Index des Elements C#
- 28. Java - Überprüfen des Wertes in einem Multidimensionalen Array
- 29. Erhalte den Index des ersten gefundenen Speicherplatzes nach einem bestimmten Index in einem String
- 30. Update SQL IntArray
Kann es im Array doppelte Nummern geben, und in welchem Fall soll der Index angezeigt werden, wenn zwei der niedrigsten Werte vorhanden sind? ? – Paddy
@Paddy Ja Duplikate sind möglich. Irgendwelche von diesen sind gut, zurückgebracht zu werden, obwohl ein (irgendein) beständiges Verhalten geschätzt würde (z. B. immer das letzte). – mafu