25
janvier
2010
#4 Les opérateurs de requête Linq de Aggregate à Where : SequenceEqual
janvier
2010
Un article de Jérôme Lambert
22 Commentaires
C’est officiel, les vacances sont finies et donc retour difficile à la réalité mais c’est quand même avec grand plaisir que je reprends du service avec cette série d’astuces sur Linq Pour recommencer, on va y aller en douceur en abordant l’opérateur SequenceEqual.
Alors. Comment faîtes-vous pour déterminer si deux listes ont les mêmes éléments ? (je parle bien des mêmes instances)
Quelque chose comme ceci ?
var membres1 = GetMembresDeveloppez();
var membres2 = GetMembresDeveloppez(); if (membres1.Count == membres2.Count)
{
foreach (var currentMembre in membres1)
{
if (membres2.Contains(currentMembre) == false)
return false;
}
}
else
{
return false;
}
var membres2 = GetMembresDeveloppez(); if (membres1.Count == membres2.Count)
{
foreach (var currentMembre in membres1)
{
if (membres2.Contains(currentMembre) == false)
return false;
}
return true;
}
else
{
return false;
}
Avec Linq, l’opérateur SequenceEqual s’occupera de faire toute la comparaison pour vous :
var membres1 = GetMembresDeveloppez();
var membres2 = GetMembresDeveloppez(); bool result1 = membres1.SequenceEqual(membres2); // Faux
bool result2 = membres1.SequenceEqual(membres1); // Vrai
bool result3 = membres1.SequenceEqual(membres1.ToList()); // Vrai
var membres2 = GetMembresDeveloppez(); bool result1 = membres1.SequenceEqual(membres2); // Faux
bool result2 = membres1.SequenceEqual(membres1); // Vrai
bool result3 = membres1.SequenceEqual(membres1.ToList()); // Vrai
Facile ?
22 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’était pas le but de mon billet mais tu as effectivement raison
arf ^^
ce que je voulais te faire dire c’est que si tu implémentais les méthodes Equals de la classe MembreDeveloppez, tu pourrais avoir vrai.
Du genre :
public class MembreDeveloppez
{
public string Nom { get; set; }
public int NombreMessages { get; set; }
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (MembreDeveloppez)) return false;
return Equals((MembreDeveloppez) obj);
}
public bool Equals(MembreDeveloppez obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
return Equals(obj.Nom, Nom) && obj.NombreMessages == NombreMessages;
}
public override int GetHashCode()
{
unchecked
{
return ((Nom != null ? Nom.GetHashCode() : 0)*397) ^ NombreMessages;
}
}
}
var membres1 = GetMembresDeveloppez();
var membres2 = GetMembresDeveloppez();
bool result1 = membres1.SequenceEqual(membres2); // vrai
C’est promis mon Nico, tu seras dans la prochaine liste, je pense que tu l’as bien mérité
bool result1 = membres1.SequenceEqual(membres2); // Faux
Donne faux tout simplement parce que la l’implémentation de la méthode « GetMembresDeveloppez » génère à chaque appel de nouvelles instances.
static List GetMembresDeveloppez()
{
return new List()
{
new MembreDeveloppez() { Nom = « The_badger_man », NombreMessages = 2000 },
new MembreDeveloppez() { Nom = « Thomas Lebrun », NombreMessages = 4000 },
new MembreDeveloppez() { Nom = « Phillippe Vialatte », NombreMessages = 2000 },
new MembreDeveloppez() { Nom= « Skyounet », NombreMessages = 3000 }
};
}
Ce sont des instances de classes (de type référence), donc, c’est la référence de l’objet qui est comparée.
Par contre, dans le cas des types valeurs (int, float) ou du cas particulier string, on aurait eu vrai vu que ce n’est plus du tout la référence qui est comparée dans ces cas là mais bien la valeur.
var mesInts1 = new List() { 1, 2, 3 };
var mesInts2 = new List() { 1, 2, 3 };
bool result4 = mesInts1.SequenceEqual(mesInts2); // Vrai
var mesStrings1 = new List() { « 1 », « 2 », « 3 » };
var mesStrings2 = new List() { « 1 », « 2 », « 3 » };
bool result5 = mesStrings1.SequenceEqual(mesStrings2); // Vrai
Voila !
je suis décu de pas faire partie de la new List :aie:
Allez, j’oriente ton prochain billet …
Mais… pourquoi ceci
bool result1 = membres1.SequenceEqual(membres2); // Faux
ca vaut faux ?
comment faire pour que ca vaille vrai, ce sont pourtant les memes membres de l’équipe … sans doute une histoire d’Equals :aie: