Utilisation de icomparer

Description

S'agissant d'une question revenant péridiquement, voici un petit exemple d'implémentation de l'interface IComparer, nécessaire pour effectuer le tri d'un type personnalisé dans un Array ou ArrayList par exemple.
Pour l'exemple nous allons nous baser sur une classe "Personne", et notre implémentation de IComparer permettra d'effectuer un tri croissant/décroissant sur chacun des éléments caractérisant la personne : Nom, Prenom et Age.
Soit 6 possiblités de tri au total.

Version minimale du Framework : 1.1

//
// REPRESENTATION DE LA CLASSE PERSONNE
//
public class Personne
{
// Methodes
public Personne(string nom, string prenom, int age);
public override string ToString();

// Propriétés
public int Age { get; }
public string Nom { get; }
public string Prenom { get; }
}

Etant donné l'éclatement en petites méthodes de la classe PersonneComparer, le mieux est de télécharger la solution afin de regarder directement le déroulement dans l'IDE.

Source / Exemple :


// La méthode principale de PersonneComparer, la seule définie par IComparer et par laquelle tout arrive :-)
// Etant donné l'éclatement en petites méthodes, 
// le mieux est de télécharger la solution afin de regarder directement le déroulement dans l'IDE.
public int Compare(object x, object y)
{
    // vérification des types des paramètres
    if ( !(x is Personne) || !(y is Personne) )
    {
        return 0;
    }

    // transtypage des instances de Personne
    Personne persX = (Personne)x;
    Personne persY = (Personne)y;

    int ret = 0;

    // lancement des tri par mode
    switch (this._mode)
    {
        case PersonneComparerSortMode.Nom:
            // tri par nom
            ret = this.DoCompareByNom(persX, persY);
            break;

        case PersonneComparerSortMode.Prenom:
            // tri par prénom
            ret = this.DoCompareByPrenom(persX, persY);
            break;

        case PersonneComparerSortMode.Age:
            // tri par age
            ret = this.DoCompareByAge(persX, persY);
            break;

        default:
            // par défaut on considère les instances comme étant équivalentes.
            ret = 0;
            break;
    }
    
    return ret;
}

Conclusion :


Interface IComparer : http://msdn.microsoft.com/fr-fr/library/system.collections.icomparer.aspx

Codes Sources

A voir é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.