Obtenez de l'index d'un élément à partir de la liste contenant des doublons possibles
bon, j'ai une liste d'objets de la classe comme ceci:
List<fruit> lst = new List<fruit>();
lst.Add(orange);
lst.Add(apple);
lst.Add(grape);
lst.Add(grape);
lst.Add(orange);
lst.Add(pear);
lst.Add(apple);
Je veux être en mesure de demander la liste à quelque chose comme
GetIndex("orange", 2) et de l'avoir de retour (dans ce cas) l'indice # pour la deuxième instance de l'objet en question (en position 4).
Cette liste sera dynamiquement rempli, et il peut même ne pas avoir une orange pour commencer. Si c'est le cas, je veux le numéro d'instance du deuxième paramètre. Si je peux obtenir la deuxième orange, ou d'obtenir de la cinquième à la mangue, etc.
liste.IndexOf(orange) renvoie la première occurrence de tous les doublons, j'ai donc besoin de quelque chose d'autre.
Des idées?
PS: j'ai omis de mentionner que le premier param sera une chaîne de caractères!
- Voulez-vous dire
GetIndex(orange, 2)
? - voulez-vous la double position de toujours , qu'advient-il si il a trois éléments
- pourquoi ne pas vous dictionnaire et de les stocker sous forme de valeurs uniques et d'interroger plus tard et de trouver l'élément que vous souhaitez.
- cela peut fonctionner...
- serait la clé de dictionnaire, soit le nombre total de cet objet, ou est-il destiné à être l'indice?
- vous devez utiliser un Dictionnaire<string, List<fruits>> où la clé du dictionnaire est le nom du fruit, et la valeur est une liste de tous les doublons. Si l'espace de stockage est un problème, vous pouvez utiliser LinkedList au lieu de la Liste.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez étendre des classes avec votre propre méthode de cette classe, malheureusement, ce n'est pas possible pour les classes génériques, donc au lieu de vous donner le type de la méthode.
Bien que c'est un peu étrange que
index
commence à 1, mais le résultat commence à 0.Ici est une extension générique de recherche que je viens de mettre en place:
Tout ce que vous avez à faire est de les appeler de la sorte:
Si l'article que vous recherchez n'est pas trouvé, il renvoie -1.
T
(ou apple) n'a pas été trouvé, elle retourne -1.ou de le rendre générique, vous pouvez utiliser certains LINQ:
Alors appel
GetIndex(lst, orange, 2)
Select()
qui ne le comptage de l'indice pour vous.Skip()
et puisFirst()
quand vous pouvez faire la même chose plus clairement avecElementAt()
?.Select(t => (int?)t.i)
et de le rendre.FirstOrDefault()
pour tenir compte des valeurs manquantes. Ensuite, vous pouvezreturn (result.HasValue ? result.Value : -1);
pour le faire fonctionner commeIndexOf()
.Une extension de dtb la réponse de compte lorsque vous ne trouvez pas la valeur que vous recherchez: