Comparer deux listes d'objets [Résolu]

cs_emmanuel9 903 Messages postés mercredi 23 février 2005Date d'inscription 16 juin 2010 Dernière intervention - 22 févr. 2006 à 13:39 - Dernière réponse : MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention
- 22 févr. 2006 à 16:40
Bonjour à tous,

J'ai deux ArrayList d'objet Personne avec nom,prenom,etc...

Et je voudrais comparer la premiere liste à la seconde.

Comment faire detecter si les deux sont identiques ou non sans faire deux boucle for imbriqué, c'est à dire je commence à lire la permiere personne de la permiere liste et je le compare avec toutes les autres personnes de la secondes listes etc... Si il y a 1000 personne, ca me fera 1000X1000 = 1 million de passage....

Par avance, merci.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 22 févr. 2006 à 13:57
3
Merci
Il faudrait savoir si tu aimerais qu'elles soient identiques au niveau du contenu global (les memes personnes mais pas forcément dans le meme ordre dans les 2 arraylist), ou si elles sont strictement identiques.

Si c'est le second cas, il suffit simplement de voir si l'element i de l'arraylist 1 est le memes que l'element i de l'arraylist 2. Donc pas de boucle imbriquée, simplement un passage de for()

Enfin deja, premiere chose a comparer: leur propriété Count. Si elle est différente, l'ArrayList ne sera pas identique.



Mx
MVP C#

Merci MorpionMx 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de MorpionMx
Meilleure réponse
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 22 févr. 2006 à 15:40
3
Merci
Si tu dois comparer plusieurs propriétés, je pense que tu ne vas pas avoir le choix...
Deja il faudra implementer l'interface IComparable a ta classe Personne, et y faire ton test de comparaison entre les objets.
Et ensuite, boucle for (ou foreach) imbriquées. Des que pour une occurence de ta boucle "englobante", tu ne trouves pas l'equivalent dans ta boucle "englobée", ca veut dire qu'il y a une différence, et tu sors de tes boucles (pour pas que cela ne continue pour rien)



Mx
MVP C#

Merci MorpionMx 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de MorpionMx
Meilleure réponse
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 22 févr. 2006 à 16:26
3
Merci
Petit essai rapide


<HR>

using System;

using System.Collections;

namespace ConsoleApplication1
{

class
Program
{

static
void Main(
string[] args)
{

ArrayList a1 =
new
ArrayList();

ArrayList a2 =
new
ArrayList();

a1.Add(
new
Personne(
"John",
"Doe"));
a1.Add(
new
Personne(
"Jane",
"Doe"));
a2.Add(
new
Personne(
"Jane",
"Doe"));
a2.Add(
new
Personne(
"John",
"Does"));

bool identique =
false;

for (
int i = 0; i < a1.Count; i++)
{

Personne p1 = (
Personne)a1[i];
identique =
false;

for (
int j = 0; j < a2.Count; j++)
{

object p2 = a2[j];

if (p1.CompareTo(p2) == 1)
{
identique =
true;

break;
}
}

if(!identique)
break;
}

Console.WriteLine(identique);

Console.ReadLine();
}
}


public
class
Personne :
IComparable
{

public
string Nom;

public
string Prenom;

public Personne(
string nom,
string prenom)
{

this.Nom = nom;

this.Prenom = prenom;
}

public
int CompareTo(
object p)
{

Personne temp = (
Personne)p;

if (
this.Prenom == temp.Prenom &&
this.Nom == temp.Nom)
return 1;

return 0;
}
}
}


<HR>

On a une classe personne, avec une méthode CompareTo qui recoit un object (casté en personne ensuite) en parametre, et qui renvoit 1 si les propriétés Nom et Prenom des personnes sont strictement identiques (a toi de voir pour les min/maj), 0 sinon.

Ensuite, eh bien ce sont 2 boucles imbriquées dans le Main, qui comparent les valeurs contenues dans les ArrayLists, et une variable booleen qui prend true quand 2 valeurs identiques sont trouvées, false autrement.
Quand le bool est a true, on continue jusqu'a qu'on ait vérifié toutes les valeurs d'un ArrayList, sinon, il a une différence, on sort de la boucle.

Verifie quand meme au prealable si tes listes ont le meme nombre d'elements avant d'entrer dans ces boucles.



Mx
MVP C#

Merci MorpionMx 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 100 internautes ce mois-ci

Commenter la réponse de MorpionMx
cs_emmanuel9 903 Messages postés mercredi 23 février 2005Date d'inscription 16 juin 2010 Dernière intervention - 22 févr. 2006 à 14:04
0
Merci
Ben en faite les listes font exactement la même taille mais c'est au niveau des propriétés (nom, prénom etc...) qu'il peut y avoir des différences. Sinon chaque objet personne possède une propriété Id qui sert à l'identifier . L'élement à l'index 0 de la liste 1 aura l'id 1 et l'élement à l'index 0 de la liste 2 aura l'index 1. C'est juste au niveau des propriété qu'il faudrait que je détecte les differences.

Exemple

Liste 1 | Liste 2

id : 1 / nom : jean id : 1 / nom : jeana
id : 2 / nom : claude id : 2 / nom : claude

ici les listes ne sont pas identiques a cause de jean et jeana
Commenter la réponse de cs_emmanuel9
cs_emmanuel9 903 Messages postés mercredi 23 février 2005Date d'inscription 16 juin 2010 Dernière intervention - 22 févr. 2006 à 15:58
0
Merci
J'ai déja utilisé cette fonction en faisant par exemple :

liste_frais.Sort(new ListeDateSorter(new Frais())) ;

Mais comment faire pour deux listes ?
Commenter la réponse de cs_emmanuel9
cs_emmanuel9 903 Messages postés mercredi 23 février 2005Date d'inscription 16 juin 2010 Dernière intervention - 22 févr. 2006 à 16:37
0
Merci
Ok, merci pour cette réponse si complète, je vais faire comme ca .
Commenter la réponse de cs_emmanuel9
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 22 févr. 2006 à 16:40
0
Merci
Y'a pas de quoi



Mx
MVP C#
Commenter la réponse de MorpionMx

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.