J'ai un tableau de par exemple et problème est d'obtenir l'index de
6 Réponses :
D'abord Obtenir le MAX:
var indices = array.Select((x, i) => new { Index = i, Value = x }) .Where(x => x.Value == max) .Select(x => x.Index);
Compte tenu de la nature de la question, l'OP ne sait probablement même pas ce que LINQ n'est ni qu'elles ne peuvent l'utiliser. J'aurais attendu jusqu'à ce que nous ayons plus d'informations avant de répondre à quelque chose comme ça
Avec une méthode d'extension indiquée que vous avez déjà la maxvalue que vous recherchez: Vous pouvez avoir: p>
iEnumerable
indexof code>. De plus, vous devez modifier vos méthodes Signature en
Allindexesof
@Felixb., La réponse originale était sur la liste
Voici comment vous pouvez le faire dans une boucle.
var indices = new List<int>(); int max = int.MinValue; for(int i = 0; i < array.Length; i++) { if(array[i] > max) { max = array[i]; indices.Clear(); } if(array[i] == max) { indices.Add(i); } }
comme un compteur à la réponse de @ Himbrombeere
Nous pouvons utiliser un dictionnaire pour chaque numéro unique, puis une liste d'entiers pour chaque index qu'il a montré. p>
var intArray = new int[5]; var dictionary = new Dictionary<int, List<int>>(); for (int i = 0; i < intArray.Length; i++) { var num = intArray[i]; if (!dictionary.ContainsKey(num)) { dictionary.Add(num, new List<int>()); } dictionary[num].Add(i); } var max = dictionary.Keys.Max(); return dictionary[max];
Vous avez raison, j'ai besoin explicitement itérer sur la valeur des clés
Oui, j'ai réparé le boîtier et la logique fixe derrière l'accès à la valeur de max. Toutes mes excuses pour l'attention laxe payée à cela.
Le principal problème est que cela fait plus que nécessaire. Je ne créerais qu'un dictionnaire comme si je devais réellement obtenir les index pour différentes valeurs, pas seulement le max.
Et si la liste est un milliard d'éléments? Dans les déclarations de LINQ ci-dessus, nous itionions toute la collection à plusieurs reprises. Le pire cas ici est itérant la liste une fois, ainsi que itérant le nombre de nombres uniques. Je suis d'accord c'est très terres mais ce n'est pas objectivement pire - éditer, je n'ai même pas vu votre réponse quand j'ai répondu à cela. Beaucoup plus succinct! Toutes mes excuses pour penser que vous avez répondu avec la réponse LINQ
Approche LINQ
int[] array = new int[] { 1, 3, 2, 3 }; int[] result = array.Select((x, i) => new { index = i, value = x }) .GroupBy(x => x.value) .OrderByDescending(x => x.Key) .First() .Select(x => x.index) .ToArray();
Utilisation de retour de rendement code> et boucle via le tableau Vous pouvez le faire:
using Linq; // include this at the top of your file, if not already present.
// ...
int[] array = new int[] {1, 3, 2, 3};
IEnumerable<int> matchingIndexes = array.AllIndexesOf(array.Max());
// Convert to array if you need one
int[] matchingIndexesArr = matchingIndexes.ToArray();
@fubo Merci pour la note, j'ai changé le code pour inclure le chèque si la valeur au i code> est la même que
SearchValue code>
ElementAT CODE> est TRES B> IN-PRESSANT lors de l'utilisation d'une boucle, car elle iTère à nouveau la collection complète et à nouveau.
Eh bien, j'ai fait une erreur similaire que vous avez remarquée. Nous tendons oublier que iEnumerable code> est juste un brunch d'élément qui attend d'être itérer en paresseux. Il n'a aucune compréhension de l'index. Lorsque vous avez besoin d'index de conducteur, vous avez besoin de données de données de données prenant en charge le concept comme une liste ou une collection ou de leur inferface respectif.
Voulez-vous dire que vous voulez tous les index de chaque instance d'un numéro unique? Pouvez-vous modifier pour nous montrer votre tentative jusqu'à présent?