Comment obtenez-vous l'indice d'un nombre dans une liste chaînée?
J'ai une liste, construit comme suit:
LinkedList<int> linked = new LinkedList<int>();
var array = new int[] { 23, 55, 64, 65 };
foreach (var item in array)
{
linked.AddLast(item);
}
Comment puis-je trouver l'indice du nombre de 64 ans?
Si vous avez besoin d'une collection basée sur des indices, pensez à utiliser
Pourquoi ne pas LinkedList(T) de mettre en œuvre le IList(T) de l'interface?
Êtes-vous sûr que
oui , je dois utiliser
L'autre manière autour de how-do-i-get-the-n-th-element-in-a-linkedlistt
List<T>
au lieu d'une liste chaînée.Pourquoi ne pas LinkedList(T) de mettre en œuvre le IList(T) de l'interface?
Êtes-vous sûr que
LinkedList
est adapté à votre problème?oui , je dois utiliser
LinkedList
L'autre manière autour de how-do-i-get-the-n-th-element-in-a-linkedlistt
OriginalL'auteur Smartboy | 2012-11-15
Vous devez vous connecter pour publier un commentaire.
La seule façon est de vérifier l'élément par élément et d'augmenter un compteur (par "seul moyen", je suis en train de dire que d'autres méthodes comme LINQ besoin de faire la même chose en interne).
Écrite à la main de la méthode d'extension devrait ressembler à quelque chose comme ceci:
Mais il peut facilement être fait à l'aide de LINQ comme @L. B a écrit (rendement de la complexité en même temps).
Merci , beaucoup @Groo
merci, mais LINQ n'est pas si difficile une fois que vous vous habituez à elle. Je préfère aussi LINQ manuellement l'itération, c'est plus concis. C'était juste pour but de montrer l'algorithme.
OriginalL'auteur Groo
Inutile avec un liste chaînée circulaire. @Smartboy: linq,
Enumerable.Select
etEnumerable.Where
peut intégrer l'index d'un élément.Quelque chose doit m'échapper. Comment voulez-vous créer une liste chaînée circulaire de
LinkedList<int>
?lorsque vous utilisez un
Select
méthode d'extension, il utiliseLinkedList
s de mise en œuvre deIEnumerable
simplement itérer sur les éléments, un par un. LeSelect
méthode, puis des projets de chaque élément dans une nouvelle instance d'une classe anonyme avec deux propriétés (valeur de l'élément"item"
, et son index"inx"
), et leFirst
méthode, puis accepte une méthode anonyme spécifiant une recherche de prédicat (prend unint
, renvoie unebool
) et retourne le premier élément qui satisfait la condition. Il y a un léger problème avecFirst
est qu'il déclenche une exception lorsqu'aucun élément n'est mis en correspondance.href="http://stackoverflow.com/a/2670199/284240">stackoverflow.com/a/2670199/284240
OriginalL'auteur L.B
Voici une autre LINQ mise en œuvre qui évite de créer des objets anonymes et retourne -1 si l'élément n'est pas dans la liste:
Il convertit la séquence de nombres à une séquence contenant l'index d'un match ou d'
null
autrement. Il prend le premier de ces si il y en a un, sinon convertit la valeur par défautint?
à-1
.Edit:
Ici est mieux (plus simple et plus performant) alternative:
i
sera égal à l'indice égal ou àlinked.Count
si la valeur64
n'a pas été trouvé.OriginalL'auteur Matthew Strawbridge
Je pense que vous devriez faire votre propre fonction pour analyser la liste et de vérifier. Le "Trouver" la fonction renvoie uniquement la première occurrence et,pour vous, il est possible d'avoir 2 ou plusieurs occurrences de 64 dans la liste.
IndexOf
fonctionne de la même manière.OriginalL'auteur Florin Petriuc
Vous pouvez faire un. 🙂 J'ai trouvé cette question d'essayer de comprendre comment qsort une liste liée. Et il m'a frappé depuis que je suis le tri des structures de toute façon tout ce que j'ai à faire est de donner à chacun un identifiant unique. Qui sera probablement de l'ordre dans lequel elles sont créées. Juste ajouter un champ int appelé seq ou idx pour chaque nœud. Changer votre ints pour les structures avec les services de renseignements à l'intérieur et attacher un autre champ int c'est votre improvisé index. Parcourant la liste va être lourd. Mais vous liez l'original ints à l'index.
Si vous ne vous attendez pas les données à déplacer, vous pouvez construire un tableau de pointeurs vers des éléments de votre liste liée. Au début, utilisez le pointeur à côté, continuer à le faire et compter le nombre de sauts. Alors consacrer votre tableau, au début de la liste et de les enregistrer dans votre tableau des adresses des pointeurs suivants. Mais quelqu'un ou quelque chose (un autre thread?) peut le visser en place par le déplacement ou l'ajout ou la suppression d'un élément. La liste pourrait continuer à travailler, mais la matrice doivent être démolis et refaits. Pourrait être relativement rapide, mais comment détecter le changement de manière fiable?
Circulaire? Utilisez simplement modulo donc à aller de l'avant idx = (idx + 1) % N où N est le nombre total de champs. Normal C de toute façon, je ne sais pas ce que C#'s limites du système.
OriginalL'auteur Alan Corey