IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Recherche inversée dans une liste


Sujet :

C#

  1. #1
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut Recherche inversée dans une liste
    Bonjour tout le monde,

    j'aimerai faire une recherche inversée dans une liste d'entiers, c'est-à-dire, rechercher de la fin vers le début,

    je ne sais pas s'il y a une méthode déjà existante pour ça pour les objets List<T>, du genre de FindIndex, parce que je sais que cette dernière permet de faire une recherche rapide d'un élement.

    voilà, j'espère que j'étais très clair,
    merci d'avance

    Bien cordialement

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    List<int> entiers = new List<int>();
     
    for (int i = 0; i < 10; i++)
        entiers.Add(i);
     
    for (int i = entiers.Count; i >= 0; i--)
        if (i == 5)
            MessageBox.Show("Trouvé");

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    tu peux aussi utiliser le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int valeurCherchee = 14;
    int indexValeur = entiers.FindLast(
        delegate(int bk)
        {
            return bk == valeurCherchee;
        }
    );
    mais avec le problème que si la recherche ne trouve rien, elle renvoie 0 comme résultat, valeur par défaut d'un int. Du coup, tu ne sauras pas si la recherche n'a rien donné ou si l'élément cherché est à l'index 0.

  4. #4
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    Utilise la méthode d'extension .Reverse(TSource) sur ta liste. Ton en inversera l'ordre et pourra la parcourir normalement.

    Edit : nécessite le FW 3.5 et l'ajout de la clause "using System.Linq" sur ta classe.

  5. #5
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    je vous remercie pour vos réponses,
    @ Papy214 : j'évite la recherche séquentielle, elle est trop couteuse en temps, et la méthode FindLast, va me donner uniquement le dernier élément, alors que je dois parcourir la liste des entiers de la fin jusqu'au début,

    @calagan99 : j'ai pensé aussi à inverser la liste des données, mais je ne sais pas s'il y a une meilleure idée ! Une méthode prédéfinie peut être.

    Merci

    Bien cordialement

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    la liste est si longue que ça ?

    s'il faut trouver plusieurs éléments, tu as la méthode FindAll qui renvoie un tableau des éléments trouvés. Mais je ne sais pas si ça correspond à ta recherche

  7. #7
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    la liste est si longue que ça ?

    s'il faut trouver plusieurs éléments, tu as la méthode FindAll qui renvoie un tableau des éléments trouvés. Mais je ne sais pas si ça correspond à ta recherche
    salut,

    j'effectue la recherche dans un ensemble de listes ordonnées, donc il n'y a aucune limite pour la taille,
    la recherche est très similaire à ce qu'on voit dans les éditeurs de texte (recherche du suivant & du précédent)

    Sinon, pour le FindAll c'est aussi une piste à exploiter

    Merci
    Bien coridialement

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    j'effectue la recherche dans un ensemble de listes ordonnées, donc il n'y a aucune limite pour la taille,
    ok mais tu sais bien quel genre de données tu vas gérer , non ?

    à moins que ça se chiffre en millions de lignes, ça doit pas impacter tant que ça les performances.

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    List<int> liste = new List<int>();
    for (int i = 1; i <= 1000000; i++)
        liste.Add(i);
     
    int valeur = 1;
    for (int i = liste.Count - 1; i >= 0 ; i--)
    {
        if (liste[i] == valeur)
        {
            MessageBox.Show("Trouvé");
        }
    }
    la réponse est instantanée

  10. #10
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Et pourquoi tu ne fais pas un binarysearch si ta liste est trieé ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    j'effectue la recherche dans un ensemble de listes ordonnées, donc il n'y a aucune limite pour la taille,
    la recherche est très similaire à ce qu'on voit dans les éditeurs de texte (recherche du suivant & du précédent)
    Il faut savoir ce que tu entends par liste ordonnée ?

    - Une SortedList
    - ou une liste que tu a triée avec un Sort
    - ou une liste dans laquelle tu a introduit des elements dans un ordre particulier ?

    Parce que je ne comprends pas bien le sens de la quetion initiale dans le contexte actuel

    j'aimerai faire une recherche inversée dans une liste d'entiers, c'est-à-dire, rechercher de la fin vers le début,
    En quoi la recherche inversée est elle nécessaire ?

    Sinon, pour le FindAll c'est aussi une piste à exploiter
    Le findAll fais une parcours exhaustif et sequentiel de toute ta liste

    Un BinaRySearch fonctionne si ta liste est triee et que tu a défini le Comparer qui peux te servir pour le tri et la recherche

    Le BinarySearch est tres rapide parce que dichotomique mais il ne te rends qu'un seul index et tu peux avoir des doubles avant et apres l'elément trouvé mais c'est gerable et certainement plus rapide qu'un findall s'il n'y a aucune limite pour la taille
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  12. #12
    Membre habitué Avatar de reeda
    Formateur en informatique
    Inscrit en
    Août 2006
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 367
    Points : 150
    Points
    150
    Par défaut
    Bonjour à tous,

    je vous remercie pour vos réponses,

    @ Papy214 : un million d'éléments n'est rien comparé à la taille de données que doit traiter mon application

    @olibara
    Il faut savoir ce que tu entends par liste ordonnée ?
    quand je disais listes ordonnées je ne parlais pas de leur contenu, mais du fait que je dois les parcourir dans un ordre précis : liste 1, liste 2, ..., liste n

    En quoi la recherche inversée est elle nécessaire ?
    je veux reproduire le même comportement qui existe dans les éditeurs de texte qu'on connait, à savoir recherche du précédent,

    Et pourquoi tu ne fais pas un binarysearch si ta liste est trieé ?
    malheureusement, les listes ne peuvent pas être triées

    Merci beaucoup
    Bien cordialement

  13. #13
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Il me semble donc que la meilleure solution serait un findall sur tes liste ensuite tu peux parcourrir le resultat de ce findall sans reparcourir ta liste
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

Discussions similaires

  1. [WD14] Recherche indices dans une liste
    Par celine37 dans le forum WinDev
    Réponses: 12
    Dernier message: 09/09/2009, 18h00
  2. Recherche assistée dans une liste
    Par tomy29 dans le forum Struts 1
    Réponses: 34
    Dernier message: 14/11/2008, 11h37
  3. Recherche rapide dans une liste
    Par jblecanard dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/09/2008, 23h53
  4. Recherche chaine dans une liste
    Par Clorish dans le forum Général Java
    Réponses: 7
    Dernier message: 28/03/2008, 11h49
  5. Recherche Element dans une liste
    Par hellodelu dans le forum ASP
    Réponses: 7
    Dernier message: 19/08/2005, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo