Probleme avec List.Exist ( rechercher si ma propriété existe déja dans ma collec

joker91170 Messages postés 7 Date d'inscription mercredi 3 février 2010 Statut Membre Dernière intervention 11 février 2009 - 23 janv. 2009 à 12:29
joker91170 Messages postés 7 Date d'inscription mercredi 3 février 2010 Statut Membre Dernière intervention 11 février 2009 - 26 janv. 2009 à 11:29
Encore debutant en C#, pour mon stage en BTS ,
je tente de developper un programme sur la gestion du materiel informatique d'une entreprise ( ecran, UC, imprimante,scanner) .

J'ai donc une classe Materiel, et des classes Ecran, Scanner etc... qui heritent des attributs de la classe Materiel. 

Chaque materiel a un seul et unique code barre.

J'aimerais donc pouvoir , avant d'ajouter un nouveau materiel à ma collection ( List<Materiel> ) , VERIFIER si la valeur du code barre SAISI par l'utilisateur du programme n'existe pas déja dans ma collection .

Imaginons que je veuille ajouter un nouvel ecran dans ma collection 
( grâce au clic sur le bouton Ajouter_materiel )

List<
Materiel> collection_materiel =
new
List<
Materiel>();  // on instancie la collection_materiel

private

void btn_Ajouter_materiel_Click(
object sender,
EventArgs e)
{

   int

cb_ecran_saisi ;

   Ecran nv_ecran =
new
Ecran(
Convert.ToInt32(txb_Ajouter_CB_Ecran.Text) )  // on instancie un nouvel ecran  

   cb_ecran_saisi =

Convert.ToInt32(txb_Ajouter_CB_Ecran.Text);
// code barre ecran saisi par l'utilisateur sur le form

   
//La suite de mon prog est censé verifier si le cb_ecran_saisi existe déja dans collection_materiel.... if

(collection_materiel.Exists ( Predicate<Materiel>cb_ecran_saisi ) ) // ET C'EST LA QUE JE NE COMPREND PAS  !!!!

{

   MessageBox.Show(
"existe deja");   }

else
{      collection_materiel.Add(nv_ecran);

}

MSDN me dit :

Predicate est le délégué d'une méthode qui retourne true, si l'objet qui lui est passé correspond aux conditions définies dans ce délégué. Les éléments du List actuel sont passés un par un au délégué Predicate et le traitement s'arrête lorsqu'une correspondance est trouvée.

* : match  : </gras>Délégué Predicate qui définit les conditions des éléments à rechercher.

Que signifient clairement Predicate ?
Dois-je faire une fonction que je placerais ensuite à la place de match ?
j'ai du mal à comprendre et cela m'empeche d'avancer ( car pour ajouter je suis forcement obligé d'effectuer une recherche , pour eviter les doublons !! ).

Encore une fois je suis novice en c#, si vous pouviez m'expliquer clairement meme sans me donner forcement la reponse, car je suis la pour apprendre...

Merci d'avance !
A voir également:

5 réponses

ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
23 janv. 2009 à 13:44
Bonjour,

Il y a beaucoup plus simple. 
 
Tu peux utiliser la classe KeyedCollection<> qui sert pour des collections d'objets contenant leur propre clé (le code barre) 


KeyedCollection étant une classe abstraite, il faut la dériver et instancier la méthode GetKeyForIetem qui renverra la clé (toujours le code barre).

Pour savoir si ta collection contient un code barre donné, il suffit alors d'utiliser la méthode Contains().

ed73
1
crougni77 Messages postés 28 Date d'inscription dimanche 24 août 2003 Statut Membre Dernière intervention 28 septembre 2009
23 janv. 2009 à 15:19
Salut joker91170

alors tu peu également implémenter une interface IEquatable<T> à ta classe Matériel. Cela pourra te servir pour d'autre développement futur.

Voici un petit exemple :

http://msdn.microsoft.com/fr-fr/library/ms131190(VS.95).aspx

Par contre , tu convertis un Code Barre en Int32 ????
tu risque je pense d'avoir un petit problème de dépassement de capacité là !!
 dans le cas de Code Barre en EAN13 çà va pas passer ...

Pour l'utilisation de Exist, il te faut comme indiqué une Predicate. ( utiliser Exist dans ton cas n'est pas terrible, c'est bcp mieux d'utiliser Constains )

Le Predicate est une méthode qui va effectuer des tests sur ton objet.

Donc

if

(collection_materiel.Exists ( MaterielSousGarantie ) )

{
// Ta liste contient du matériel sous Garantie

}

public static bool M
aterielSousGarantie(Materiel
mat)
{
    if  mat.SousGarantie() return true;  // en supposant que tu as une méthode SousGarantie() dans ta classe Matériel ;)

return false;
}
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
23 janv. 2009 à 15:39
Bonjour,

class Program
{
    static void Main(string[] args)
    {
        int idToCheck = 2341235;


        List<Material> ms1 = new List<Material>();
        ms1.Exists(new Predicate<Material>(delegate(Material m)
        {
            return m.Id == idToCheck;
        }));
    }
}


class Material
{
    public int Id { get; set; }
}





<hr />
-Blog-
-Site Perso-
0
joker91170 Messages postés 7 Date d'inscription mercredi 3 février 2010 Statut Membre Dernière intervention 11 février 2009
26 janv. 2009 à 11:22
reponse à crougni77 : Merci pour tes conseils et tes explications , j' ai compris que int32 ne suffisait pas ( dc utilisation de long( = int64) ainsi que le but de la fonction exists. Maisj'ai des difficultés avec l'utilisation de contains . 
J'ai essayé d'ajouter un nouveau materiel de type ecran (par exemple) avec le code suivant :


// on instancie un nouvel ecran










Ecran
nv_ecran =

new



Ecran (
Convert
.ToInt64  txb_Ajouter_CB_Ecran.Text),       
                                                      txb_Ajouter_Modele_Ecran.Text,  txb_Ajouter_Type_Ecran.Text,cbox_Ajouter_Etat_Ecran.Text,
                                                      
Convert
.ToInt16(txb_Ajouter_Taille_Ecran.Text) ) ;













if
( collection_materiel.Contains(nv_ecran))
{


MessageBox
.Show(

"existe deja"
);
}


else

{
collection_materiel.Add(nv_ecran);
}Puis j'ai effectué un test, en ajoutant 2 fois le meme ecran , or la messagebox ne se montee jamais. En utilisant l'espion de Visual studio sur collection_materiel, j'ai remarqué que le count = 2 et il ya doublon ( ce que je ne veux surtout pas ! ). Ou est mon erreur ? surtout que dans mon contains j'ai mis nv_ecran ( si je ne me trompe pa il verifie si toutes les propriétés de nv_ecran existent dans ma collection, nan ?).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
joker91170 Messages postés 7 Date d'inscription mercredi 3 février 2010 Statut Membre Dernière intervention 11 février 2009
26 janv. 2009 à 11:29
Bidou merci pour ta reponse, c'est ce qu'apparemment je cherchais à faire ( meme si contains à l'air plus simple )
par contre je ne comprends pas l'utilisation de delegate ?

et la fonction Exists ne doit-elle pas retourner true ou false ?
0