Icomparer générique et réflexion

Soyez le premier à donner votre avis sur cette source.

Vue 8 228 fois - Téléchargée 219 fois

Description

Cette source pourrais très bien être implémenter un Winform.
Petit exemple illustrant la comparaison de n'importe quel objet par rapport à un nom d'une de ses méthodes/propriété/retour de méthode.
La classe IComparer est utilisée, ainsi on peut l'utiliser pour tout objet qui utilise la méthode Sort(IComparer), les liste par exemple.
L'implémentation est assez simple c'est se qui fait la force de ce comparateur.

Source / Exemple :


//On cree notre petite liste
 ListeEntreprise = new List<FirmUser>();
 ListeEntreprise.Add(new FirmUser("Bouygues Télécom"));
 ListeEntreprise.Add(new FirmUser("France Télécom"));
 ListeEntreprise.Add(new FirmUser("SFR"));
 ListeClient = new List<ClientUser>();
 ListeClient.Add(new ClientUser("Martin", "Jean", 20, "20 rue du louvre",ListeEntreprise[1]));
 ListeClient.Add(new ClientUser("Zert", "Romain", 25, "20 allé du louvre",ListeEntreprise[2]));
 ListeClient.Add(new ClientUser("Armand", "Bob", 50, "Place du louvre",ListeEntreprise[0]));
 ListeClient.Add(new ClientUser("Martin", "Julie", 18, "258 rue du louvre",ListeEntreprise[1]));
 ListeClient.Add(new ClientUser("Hounou", "koffi", 34, "20 rue du louvre",ListeEntreprise[0]));
 
//On cree le filtre 
private List<ObjectComparerFilter> _Filter;
public List<ObjectComparerFilter> Filter
{
	get
	{
		if (_Filter == null)
		{
			_Filter = new List<ObjectComparerFilter>();
			if (string.IsNullOrEmpty(HiddenFilter.Value))
			{
				HiddenFilter.Value = "nom,0;prenom,0;age,0;adresse,0;entreprise,0";
			}
			string[] filterTmp = HiddenFilter.Value.Split(';');
			foreach (string str in filterTmp)
			{
				string[] strTmp = str.Split(',');
				_Filter.Add(new ObjectComparerFilter(strTmp[0], ((ObjectComparerFilter.Order)(int.Parse(strTmp[1])))));
			}
		}
		return _Filter;
	}
	set
	{
		_Filter = value;
		HiddenFilter.Value = "";
		for (int i = 0; i < value.Count; i++)
		{
			HiddenFilter.Value += value[i].nom + "," + ((int)value[i].order).ToString();
			if (i < value.Count - 1)
			{
				HiddenFilter.Value += ";";
			}
		}
	}
}

//Et on trie
//le filtre par défaut: "nom,0;prenom,0;age,0;adresse,0;entreprise,0";
//nom== nom de la proriété, 0 = pas de trie (-1 et 1 sinon)
ObjectComparer<ClientUser> _ObjectComparer = new ObjectComparer<ClientUser>(Filter);
ListeClient.Sort(_ObjectComparer);

Conclusion :


Le reste dans le zip :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

jesusonline
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
17 -
pas besoin de T y'aura de l'inference de type :

Orderer.Sort(l, delegate(Person p){
return p.Name;
}, delegate(Person p){
return p.Age;
});

En fait après reflexion, je pense que tu pourrais remplacer U par IComparable dans la méthode Sort (et supprimer la contrainte where) car tu peux pas avoir une Get[] où U aurait un type différent, donc autant passer par un IComparable directement.

le mot clé params veut dire que tu peux mettre autant d'argument que voulu, ils vont se regrouper dans un tableau automatiquement.
lakichemole
Messages postés
253
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
18 mai 2009
-
Ok j'ai donc pas tout compris,Je vais abuser de ta patience encore une fois mais en gros l'appel de ta fonction pour une List liste ou User à la propriété age ça donne quoi avec ta méthode statique?
orderer.Sort<String>(Liste,... (la suite?)
jesusonline
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
17 -
On trie d'abord par la premiere propriété puis la seconde propriété. Si les premières propriétés sont égales alors on check la seconde et ainsi de suite donc il est nécessaire de faire le break;
lakichemole
Messages postés
253
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
18 mai 2009
-
oki c'est qu'une question d'assemblie alors? Y a pas une question d'OS aussi?
Sinon je viens de faire quelque petit tests pour confirmer par des fait se que tu disait à propos des perfs:
avec ta méthode pour 2400 lignes : 15 ms pour trier par nom
avec ma méthode pour 2400 lignes : 190 ms pour trier par nom
et la tu me diras "jte l'avais dis" et là je répondrais:
"Tu est peut être le jésus du .NET mais j'en suis le St thomas je ne crois que se que je vois!"
:)
Bon si j'ai bien compris je remplace mon objet par ta méthode static Orderer par contre encore un truc pourquoi tu fais ça dans ton foreach:
if (v != 0)
break;
Ca voudrais dire qu'on ne peut trier que sur une colone ou que l'ordre de trie est forcément l'ordre des paramètres?
jesusonline
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
17 -
oui et non, le marketing chez microsoft c'est du n'importe quoi :)

le compilateur C#3 compile pour la CLR2 donc tu peux utiliser les assemblies du framework 2.0.
Le compilateur C#3 est livré avec .net 3.5 donc aussi avec VS2008, c'est pour ca que VS2008 permet de "compiler" pour .net 2.0, en fait il ne fait que ne pas inclure les assemblies du framework 3.x.

Le framework 3.0 et 3.5 tourne sur la CLR2 également.

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.