Supprimer element d'une class

Signaler
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014
-
Messages postés
15913
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 mai 2021
-
Bonjour à tous

J'ai une class ou j'aimerais enlevé des éléments:
 public class Numero
        {
            public int Num=0;
            public List info = new List();   
        }
        public class Info
        {
            public string Nom, Prenom, EmailP,EmailS,NumTelP,NumTelS,Fax,Adresse,Com,DateNais,Relation; 
        }


Par exemple, une fois remplie, j'ai Num=8, donc j'ai 8 clients avec leurs coordonnées.
Je voudrais enlever le 3 ème client. J'ai réussie à enlever les informations du 3 ème client( nom, adresse, tel,...) comme ceci:
NumeroClient.info[Select] = null; // Select est l’élément a retirer (3)
NumeroClient.Num--;

mais l'"espace" attribué au client est encore pris, car dans ma classe, j'ai encore 8 cases.
Je n'ai pas trouvé l'option RemoveAt(i) comme on peut trouver dans plusieurs exemple.
Comment faire ?
Merci
Grégory
A voir également:

9 réponses

Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
Bonjour,
Il faut que tu enlèves ton élément de la liste avec la fonction Remove.
NumeroClient.info.RemoveAt[Select];


Num est inutile, car tu peux l'obtenir à tout instant par une propriété, ce qui t'évite de gèrer ce nombre
int Num
{
   get
   {
    return info.Count;
   }
}


Bon codage.
louis
Messages postés
15913
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 mai 2021
540
Bonjour
si ton num set à compter le nombre d'enregistrement dans ta list d'infos, il y a plus symple:
info.Count;


NumeroClient.info[Select] = null; // Select est l’élément a retirer (3)
là tu n'enlèves pas un élément tu le remplace par null

Je n'ai pas trouvé l'option RemoveAt(i) comme on peut trouver dans plusieurs exemple

Remove() ne sert pas à enlever l'enregistrement à un index, ça c'est RemoveAt(). Remove enlève une instance, deux exemples:
            info toto = info[1];
            info.Remove(toto);//remove enlève l'instance toto

            info.RemoveAt(3);//removeAt enlève l'index 3


Tes classes sont "mal codées", il est très déconseillé en C# de mettre les variables Public, voilà qui serait mieux
    public class Numero
    {
        //public int Num = 0;
        private List info = new List();// ma variable privée

        public List Infos// une propriété pour y accéder
        {
            get { return info; }
            set { info = value; }
        }

        public int Num//num qui retourne le nombre d'enregistrement devient en lecture seule
        {
            get { return info.Count; }
        }
    }


pour le cas ou (aujourd'hui) tu n'as pas besoin de variable interne à la classe alors comme ça
    public class Info
    {
        public string Nom {get; set;}
        public string Prenom { get; set; }
        public string  EmailP {get; set;}
        ...
    }

Ainsi le jour ou tu dois agir sur une donnée dans la classe, tu crees une variable interne, reformule les get set et pour l'extérieur pas de cahngements
Whismeril
Messages postés
15913
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 mai 2021
540
Ha j'ai été tellement long à taper que louis m'a grillé!


Whismeril
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Allo les gars

Merci pour vos conseilles. Mais ni Remove(toto) ni RemoveAt(3) ne fonctionne, voici le message d'erreur:

Erreur	1	'WindowsFormsApplication1.Form1.Info' ne contient pas une définition pour 'RemoveAt' et aucune méthode d'extension 'RemoveAt' acceptant un premier argument de type 'WindowsFormsApplication1.Form1.Info' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?)	C:\Users\Gregory\Desktop\Carnet\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs	149	18	WindowsFormsApplication1



Voici les using dans mon code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml.Serialization;
using System.Xml;


Ensuite, je veux bien essayer de changer mes classes pour qu'elles ne soient plus public comme me propose Whismeril par
public class Info
    {
        public string Nom {get; set;}
        public string Prenom { get; set; }
        public string  EmailP {get; set;}
        ...
    }

Je ne connais pas la façon de faire une classe avec {get; set;}(je commence avec les classes), je vais devoir chercher un peu, mais ne manquerais t'il pas un liste quelque par dans l'exemple, car les données doivent se répéter pour chaque client ??!!

Merci
Greg
Messages postés
15913
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 mai 2021
540
Tu mélanges le type de la donnée (la classe Info) et le contenant des plusieurs instances de cette donnée (la liste info)

Dans mes exemple, la liste de type Info existe toujours dans la classe Numero, j'ai tendances à mettre un s à mes noms de listes pour me dire "tiens y'a pleins d'infos c'est donc une liste!"

Les méthodes Remove et RemoveAt sont issues de la List, celle qui est dans la classe Numéro pas celle de la classe Info




Whismeril
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
ReBonjour,
Je pense que ton problème vient du nommage de tes variables, tu ne doit pas utiliser la bonne variable;ta classe s'appelle Info avec majuscule et ta list info avec minuscule, c'est cette dernière qu'il faut utiliser :
 List infos = new List();


Après avoir ajouté tes éléments, tu peux faire
infos.RemoveAt(3);


Par contre si tu veux enlever le troisième, l'index doit être 2 , car le premier index est 0.

Sinon, il faut suivre les indications de Whismeril en ce qui concerne les élements de ta classe , tout en privé et ensuite on crée des propriétés pour y accéder. Et essaie de ne pas nommer une liste de classe avec le même nom que la classe. Dans ton cas
List infos =  new List()

serait mieux pour éviter les confusions.
louis
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Allo les gars

Merci de votre aide. Malheureusement, je n'aurais pas le temps de regarder cela avant la fin de semaine.

Dès que j'ai un moment, je fais les modifications que vous m'avez conseillé.

Merci encore

Greg
Messages postés
39
Date d'inscription
vendredi 23 avril 2010
Statut
Membre
Dernière intervention
24 avril 2014

Une dernière information avant que je fasse toutes les modifications.

En me servant du code:
public class Info
    {
        public string Nom {get; set;}
        public string Prenom { get; set; }
        public string  EmailP {get; set;}
        ...
    }

Je voudrais avoir l'option de mettre soit les noms ou prénoms en ordre alphabétique. Est-ce que selon vous j'ai besoin d'avoir d'autres informations pour y arriver ?

Je m'explique, de la façon dont je l'ai fait, je ne pense pas pouvoir mettre les noms et prénoms en ordre alphabétique, car le premier client entré, avait la case 1, le deuxième avait la case 2... c'est en sélectionnant son nom avec une listbox (qui contenient tous les clients),je récupérais ça position, ce qui me permettait d'afficher les informations propre au nom. Mais si je met les noms dans un ordre différent, le nom de la case 1 ne correspond plus forcement aux informations que contient la case 1.

En écrivant ces lignes, je dis que peut-être que c'est la classe complète qu'il faudrait modifier quand je fais le tri (ce qui semble difficile), de cette façon, les informations continuent à se suivre ou de créer un tableau de liaison qui me permettrais de savoir que les clients 4 est maintenant à la position 10 et le client 2 à la position 4...

Quand pensez-vous ?

Greg
Messages postés
15913
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
9 mai 2021
540
Bonjour pour trier une liste tu as (au moins) deux solutions:
1 implémenter l'interface iComparable

public class Info:iComparable

Tu fais click droit / implémenter l'interface sur iComparable, ça va t'écrire une méthode CompareTo, laquelle doit retourner -1 (= plus petit) 0 (= égal) ou 1 (= plus grand).
Pour comparer sur le Nom ça s'écrit comme ça:
return this.Nom.CompareTo(other.Nom);//Nom est un string qui est déjà iComparable


2 utiliser Linq

Whismeril