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 :

supprimer les elements d'une liste non générique


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 83
    Points : 60
    Points
    60
    Par défaut supprimer les elements d'une liste non générique
    Salut,
    pour supprimer les elements d'une liste non générique j'ai procédé comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    if (reqToCorverageReview.Count != 0)
                {
                    int control = 0;
                    int j = (reqToCorverageReview.Count)+(reqToCorverageReview.Count);
                    int h = reqToCorverageReview.Count;
                    int k = reqToCorverageReview.Count;
                    for (int i = 1; i <j; i++)
                    {
                        if (i > h)
                        {
                            break;
                        }
                        if (i > k)
                        {
                            int a = h - control;
                            reqToCorverageReview.Remove(a);
                        }
                        else
                        {
                            reqToCorverageReview.Remove(i);
                        }
                        control++;
                        k--;
                    }
                }
    j'ai fait quelques tests , ca fonctionne. Cette implementation est elle stabil? Sinon quelqu'un aurait il quelque chose d'autre a me proposer?

    Merci

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    C'est quoi le but de la manip?

  3. #3
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    Oui ça rime pas à grand chose, en plus ça ne devrait pas marcher :
    1) il faut que ce soit une liste d'entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    reqToCorverageReview.Remove(a);
    sinon il faut utiliser
    reqToCorverageReview.RemoveAt(a);
    2) la boucle for est senser parcourir 2 fois la taille de la list et un break permet de sortir au bout d'1 fois la taille de la list !! Pourquoi faire ?
    3) si i > k alors on retire un élément de list ayant pour valeur la taille initial de la liste moins le nb d'élément enlevé (soit le nombre d'élément restant)

    Bref ok ça bug pas mais ça veux rien dire cet algo.
    Si tu enlève n (n était la taille de la liste) fois le 1er element de la liste tu videras la liste...

  4. #4
    Membre actif Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Points : 293
    Points
    293
    Par défaut
    Bon, je ne suis pas sur C# depuis longtemps,
    Je ne connais que IList et ArrayList ...
    Donc je vais faire plusieurs parcours ^^

    Sachant qu'on possède une liste de N éléments
    On sait que : j = 2 * h = 2 * N

    Si Remove supprime un élément à une position :
    Lorsque i > k
    Ça veut dire que i est à la moitié ou plus
    Et que control > k (vu que control évolue de la même façon).
    Alors (h - control) = (h - i) >= (N - (N / 2)) >= N / 2
    Donc tu tapes en dehors du tableau ...

    Si maintenant Remove supprime un objet donné :
    Vu que i est un entier,
    Si les objet contenus ne le sont pas, il n'y aura aucune suppression.
    Si les objets sont des entiers,
    Après avoir supprimé les éléments >= (N / 2)
    Tu te retrouves avec l'instruction i > k
    la variable a évoluée alors comme la décrémentation de i
    Tu te retrouves donc à supprimer des éléments déjà supprimés ...

    Conclusion,
    Si Remove n'envoie pas d'Exception,
    Tu te retrouves avec une liste non vide
    Où il existe :
    - soit tous les éléments,
    - soit les valeurs supérieures à ~(N/2)
    Sinon, l'algo te pète à la figure d'office ^^

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 83
    Points : 60
    Points
    60
    Par défaut
    En fait si je fais juste ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i = 1;i<=ReqtoCorverageReview.count;i++){
    ReqtoCorverageReview.Remove(i);
    }
    ca ne fonctionne pas . Chaque fois que je supprime le un element de la liste, ReqtoCoverageReview.count diminu, et à un moment J'aurai i>ReqtoCorverageReview , je ne pourrai donc pas supprimer tous les élements de ma liste. J'ajoute un peu de commentaires aux codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    //nombre d'element supprimé de ma liste
    int control = 0;
    //j : double du nombre d'elements contenu dans la liste
                    int j = (reqToCorverageReview.Count)+(reqToCorverageReview.Count);
    //h: le nombre d'element de la liste a l'initial
                    int h = reqToCorverageReview.Count;
    //k: nombre d'element de la liste que je décrémente chaque fois que je supprime un elment de la liste
                    int k = reqToCorverageReview.Count;
                    for (int i = 1; i <j; i++)
                    {
    //si i est supperieur au nombre d'element initial qu'il y avait dans ma liste, alors break
                        if (i > h)
                        {
                            break;
                        }
    //si i est supperieur a k, le nombre d'element actuel se trouvant dans ma liste alors...Supposons que nous avions au depart 5 elts dans la liste, et que nous en avions supprimé 3 deja(k=3 i=4).h-contro me retourne le nombre d'element restant dans la liste.
                        if (i > k)
                        {
                            int a = h - control;
                            reqToCorverageReview.Remove(a);
                        }
                        else
                        {
                            reqToCorverageReview.Remove(i);
                        }
                        control++;
                        k--;
                    }
                }

  6. #6
    Membre actif Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Points : 293
    Points
    293
    Par défaut
    Quel est le type de ReqtoCorverageReview.
    Sinon, il faut rappeler qu'un tableau dans n'importe langage (à ma connaissance) débute par l'indice 0.
    (notion établie du fait d'opération sur les pointeurs, l'indice i est la position en mémoire du tableau plus i fois la taille de l'élément contenu)

    Donc s'il y a 5 éléments dans ta liste, supprimer le 5ème revient à supprimer la position 4 de la liste.

    Une simple boucle devrait suffire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for ( i = 0; i < ReqtoCorverageReview.Count; ++i )
      ReqtoCorverageReview.Remove(0);

  7. #7
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Et sinon, ca te convient pas ca?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReqtoCorverageReview.Clear()
    Si tu veux à tout prix itérer, c'est comme ca que tu dois t'y prendre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while(ReqToCoverageReview.Count>0)
        ReqToCoverageReview.Remove(0);

  8. #8
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Le code me parait un peu farfelu...

    1- Quel est le véritable besoin qui se cache derrière cet algorithme alambiqué ?
    2- Que contient réellement ta liste ?
    3- Pourquoi ne pas utiliser une collection générique ?

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 83
    Points : 60
    Points
    60
    Par défaut
    Collection générique , j'y ai pensé, mais seulement cette liste je l'utilise plus loin dans un tool(écrit en vbscript) et le script de ce tool n'accepte pas de collection générique. Ma liste contient des Objects spécifiques a ce tool.
    "Clear" n'existe que pour les Collections générique et l'indexe des élements d'une collection non générique commence par 1.

  10. #10
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Quel est le type de ta liste, quelle interface implémente-t-elle?
    Clear() existe aussi pour les collections non générique comme ArrayList...
    Clear est une méthode de l'interface IList, ce qui signifie que si il y a le Remove de IList alors il y'a le Clear de IList

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 83
    Points : 60
    Points
    60
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private List reqToCorverageReview;
     reqToCorverageReview = new List();

  12. #12
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    C'est quoi ce type List? Il sort d'ou? C'est pas un type du framework .Net.
    Il implémente quoi? D'ailleurs si c'est une lite qui n'implémente pas IList, c'est codé avec les pieds

  13. #13
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Er3van Voir le message
    1- Quel est le véritable besoin qui se cache derrière cet algorithme alambiqué ?
    2- Que contient réellement ta liste ?
    Tu n'as pas vraiment répondu...
    On peut difficilement te donner la réponse appropriée à ton problème quand on ne le comprend pas...

  14. #14
    Membre du Club
    Homme Profil pro
    Developpeur .Net
    Inscrit en
    Mai 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Developpeur .Net
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 32
    Points : 40
    Points
    40
    Par défaut supprimer les elements d'une liste non générique
    Vous pouvez essayer ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
            //Ma list
            List<string> lst = new List<string>() 
            { 
                 "patrick","franck","hello"
            };
    
            public List<string> RemoveItem(List<string> mylist)
            {
                while (mylist.Count > 0)
                {
                    foreach (string str in mylist.ToList())
                    {
                        if (str.Contains("tri"))
                        {
                            mylist.Remove(str);
                        }
                    }
                }
                return l;
            }
    Lorsque vous supprimer un element d'une list tachez d'ajouter "ToList() ou ToArray()".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [langage] Supprimer un élément dans une liste
    Par myjuna dans le forum Langage
    Réponses: 15
    Dernier message: 06/08/2014, 11h49
  2. Réponses: 10
    Dernier message: 19/09/2006, 03h15
  3. [Débutant] Doubler les éléments d'une liste
    Par guillaume07 dans le forum Prolog
    Réponses: 4
    Dernier message: 25/08/2006, 17h21
  4. [CSS] largeur fixe pour les elements d'une liste
    Par arnolpourri dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 24/05/2006, 13h25
  5. Rechercher les element d'une liste dans une autre liste
    Par fessebleu dans le forum Langage
    Réponses: 30
    Dernier message: 24/04/2006, 21h23

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