octobre
2009
Aujourd’hui pour bien commencer la semaine, on va aborder deux opérateurs que j’affectionne tout particulièrement : Single et SingleOrDefault.
Pour ces opérateurs, on va devoir préciser notre classe MembreDeveloppez en y ajoutant un champ ID qui représente un identifiant unique pour chaque membre de developpez.com.
{
public int ID { get; set; }
public string Nom { get; set; }
public int NombreMessages { get; set; }
// …
}
Et au passage, voici la nouvelle implémentation de la méthode GetMembresDeveloppez() qui (pour ceux qui n’auraient pas suivi) retourne une liste d’instances de la classe MembreDeveloppez :
{
return new List<MembreDeveloppez>()
{
new MembreDeveloppez(){ ID=1, Nom=« Jérôme Lambert », NombreMessages = 3000},
new MembreDeveloppez(){ ID=2, Nom=« Louis-Guillaume Morand », NombreMessages = 2500},
new MembreDeveloppez(){ ID=3, Nom=« Aspic », NombreMessages = 1200},
new MembreDeveloppez(){ ID=4, Nom=« Dev01″, NombreMessages = 530},
new MembreDeveloppez(){ ID=5, Nom=« Giovanny Temgoua », NombreMessages = 8300},
new MembreDeveloppez(){ ID=6, Nom=« LefortLudovic », NombreMessages = 1200},
new MembreDeveloppez(){ ID=7, Nom=« nico-pyright(c) », NombreMessages = 660},
new MembreDeveloppez(){ ID=8, Nom=« Skyounet », NombreMessages = 4300},
new MembreDeveloppez(){ ID=9, Nom=« Smyley », NombreMessages = 2200}
// …
};
}
Maintenant la question du jour : comment feriez-vous pour récupérer un membre de developpez.com sur base de son identifiant ? On va prendre comme exemple le membre Skyounet avec l’identifiant 8.
J’ai l’impression que certains, qui ont suivi cette série de billets depuis le début, ont envie de proposer une solution avec l’opérateur First (voir FirstOrDefault) :
SampleLibrary.
MembreDeveloppez membreID8 = membres.First(membre => membre.ID == 8);Et bien pas de chance mais ce n’est pas tout à fait juste car on parle bien d’identifiant unique. Or avec l’opérateur First (ou FirstOrDefault), on récupère que le premier élément de la séquence résultante, or, si notre séquence venait à contenir plus d’un membre avec l’identifiant 8, il y aurait un réel problème au niveau de l’intégrité de vos données et pire encore, vous auriez fermé les yeux face à ce cas.
Le code suivant va donc s’exécuter correctement mais vous passerez à côté du fait que deux membres ont l’identifiant 8 :
membres.Add(new SampleLibrary.MembreDeveloppez() { ID = 8, Nom = « Inconnu numéro 8″, NombreMessages = 0 });
SampleLibrary.
MembreDeveloppez membreID8 = membres.First(membre => membre.ID == 8);C’est là que notre opérateur Single va être intéressant car il renverra une exception dans deux cas :
- Lorsqu’il n’y aura pas d’élément dans notre résultat (comme avec First d’ailleurs)
- Lorsqu’il y aura plus d’un élément dans notre résultat !
Le second cas répond donc exactement à notre problématique :
membres.Add(new SampleLibrary.MembreDeveloppez() { ID = 8, Nom = « Inconnu numéro 8″, NombreMessages = 0 }); try
{
SampleLibrary.MembreDeveloppez membreID7 = membres.Single(membre => membre.ID == 7);
//SampleLibrary.MembreDeveloppez membreID8 = membres.Single(membre => membre.ID == 8); // => Génère une exception
Console.WriteLine(« Le membre avec l’identifiant 8 est {0} », membreID7.Nom);
}
catch (System.Exception exc)
{
Console.WriteLine(« La requête n’a pas renvoyé un et un seul membre. »);
}
Pour ce qui est de l’opérateur SingleOrDefault, il se comporte comme Single excepté le fait qu’il renverra null lorsque le résultat n’aura pas d’élément (contrairement à Single qui génèrera une exception).
{
SampleLibrary.MembreDeveloppez membreID1000 = membres.SingleOrDefault(membre => membre.ID == 1000);
if (membreID1000 != null)
{
Console.WriteLine(« Le membre avec l’identifiant 1000 est {0} », membreID1000.Nom);
}
else
{
Console.WriteLine(« Il n’existe pas de membre avec l’identifiant 1000. »);
}
}
catch (System.Exception exc)
{
Console.WriteLine(« La requête n’a pas renvoyé un et un seul membre. »);
}
Alors fan ou pas ?!
2 Commentaires + Ajouter un commentaire
Déménagement
Next Microsoft CEO
Articles récents
- Changement d’adresse de ce blog
- Article : les nouveautés de C# 5.0
- Modèle Entity Framework généré avec SQL Server 2008 et utilisé sous SQL Server 2005
- Les photos, vidéos et cadeaux des TechDays 2011
- La première journée en ligne sur TechDays TV
- Suivez les TechDays 2011 comme si vous y étiez sur la chaîne TechDays TV
- Téléchargez le programme des conférence des TechDays 2011
- Dernier jour des TechDays = plus de chance de remporter des cadeaux sur le stand de dvp !
- Venez à notre rencontre lors des TechDays 2011
- Les flux à ne pas rater lors des TechDays 2011
- Les TechDays 2011 s’invite sur votre smartphone Windows Phone 7
- Exclu des cadeaux du concours Developpez.com lors des TechDays 2011
- Ouverture de la galerie d’images sur notre site des TechDays
- Partagez votre expérience des Microsoft TechDays
- Grand concours Microsoft “FAN des TechDays 2011” : épisode 2 !
- Mettez-vous aux couleurs des TechDays 2011 !
- Developpez.com aux TechDays 2011
- Le Challenge Azure 2010 est fini !
- Suivez la keynote de la pdc10 en direct sur internet à 18h !
- MVP Visual C# 2010 – 2011 !!!
C’est bien juste, j’ai corrigé
Merci
Pour le style, une petite erreur, même si le résultat est le même :
membres.Add(new SampleLibrary.MembreDeveloppez() { ID = 8, Nom = "Inconnu numéro 8", NombreMessages = 0 });//ID=8 et non 9 => deux membres ont l'identifiant 8 <br />
<br />
SampleLibrary.MembreDeveloppez membreID8 = membres.First(membre => membre.ID == 8);
Sinon c’est un bon exemple.