none
trie d'une List en c# RRS feed

  • Question

  •  

    bonjour,

     

    j'ai une List d'objet de type custom List<custom> lstCust = new List<custom>(id , nom, prenom); j'aimerai la trier par id ou par nom ou par prenom.

     

    comment puis je faire ce trie ?

    merci.

     

    cordialement.

    mardi 27 novembre 2007 17:02

Réponses

  • Utilise un Comparer ou un Comparison pour faire un tri "Custom" sur ta liste générique.

     

    http://msdn2.microsoft.com/en-us/library/3da4abas.aspx

    mardi 27 novembre 2007 17:48
    Modérateur
  • Tu crée une classe qui implémente  IComparer et tu retournes la valeur -1,0 ou 1. Selon ce que tu auras décidé de comparer. Donc tu peux même faire ton tri sur plusieurs attributs si tu veux.

     

    Extrait de code

    using System;
    using System.Collections.Generic;

    public class DinoComparer: IComparer<string>
    {
        public int Compare(string x, string y)
        {
            if (x == null)
            {
                if (y == null)
                {
                    // If x is null and y is null, they're
                    // equal.
                    return 0;
                }
                else
                {
                    // If x is null and y is not null, y
                    // is greater.
                    return -1;
                }
            }
            else
            {
                // If x is not null...
                //
                if (y == null)
                    // ...and y is null, x is greater.
                {
                    return 1;
                }
                else
                {
                    // ...and y is not null, compare the
                    // lengths of the two strings.
                    //
                    int retval = x.Length.CompareTo(y.Length);

                    if (retval != 0)
                    {
                        // If the strings are not of equal length,
                        // the longer string is greater.
                        //
                        return retval;
                    }
                    else
                    {
                        // If the strings are of equal length,
                        // sort them with ordinary string comparison.
                        //
                        return x.CompareTo(y);
                    }
                }
            }
        }
    }

    public class Example
    {
        public static void Main()
        {
            List<string> dinosaurs = new List<string>();
            dinosaurs.Add("Pachycephalosaurus");
            dinosaurs.Add("Amargasaurus");
            dinosaurs.Add("Mamenchisaurus");
            dinosaurs.Add("Deinonychus");
            Display(dinosaurs);

            DinoComparer dc = new DinoComparer();

            Console.WriteLine("\nSort with alternate comparer:");
            dinosaurs.Sort(dc);
            Display(dinosaurs);

            SearchAndInsert(dinosaurs, "Coelophysis", dc);
            Display(dinosaurs);

            SearchAndInsert(dinosaurs, "Oviraptor", dc);
            Display(dinosaurs);

            SearchAndInsert(dinosaurs, "Tyrannosaur", dc);
            Display(dinosaurs);

            SearchAndInsert(dinosaurs, null, dc);
            Display(dinosaurs);
        }

        private static void SearchAndInsert(List<string> list,
            string insert, DinoComparer dc)
        {
            Console.WriteLine("\nBinarySearch and Insert \"{0}\":", insert);

            int index = list.BinarySearch(insert, dc);

            if (index < 0)
            {
                list.Insert(~index, insert);
            }
        }

        private static void Display(List<string> list)
        {
            Console.WriteLine();
            foreach( string s in list )
            {
                Console.WriteLine(s);
            }
        }
    }

    /* This code example produces the following output:

    Pachycephalosaurus
    Amargasaurus
    Mamenchisaurus
    Deinonychus

    Sort with alternate comparer:

    Deinonychus
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus

    BinarySearch and Insert "Coelophysis":

    Coelophysis
    Deinonychus
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus

    BinarySearch and Insert "Oviraptor":

    Oviraptor
    Coelophysis
    Deinonychus
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus

    BinarySearch and Insert "Tyrannosaur":

    Oviraptor
    Coelophysis
    Deinonychus
    Tyrannosaur
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus

    BinarySearch and Insert "":


    Oviraptor
    Coelophysis
    Deinonychus
    Tyrannosaur
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus
     */

     

     

    http://msdn2.microsoft.com/en-us/library/234b841s.aspx

     

    C'est très simple comme concept, et dans ta fonction compare tu peux mettre ce que tu veux!

    mardi 27 novembre 2007 18:32
    Modérateur

Toutes les réponses

  • Utilise un Comparer ou un Comparison pour faire un tri "Custom" sur ta liste générique.

     

    http://msdn2.microsoft.com/en-us/library/3da4abas.aspx

    mardi 27 novembre 2007 17:48
    Modérateur
  •  

    est ce que je peut la faire sur plusieurs attributs en même temp ?
    mardi 27 novembre 2007 18:17
  • Tu crée une classe qui implémente  IComparer et tu retournes la valeur -1,0 ou 1. Selon ce que tu auras décidé de comparer. Donc tu peux même faire ton tri sur plusieurs attributs si tu veux.

     

    Extrait de code

    using System;
    using System.Collections.Generic;

    public class DinoComparer: IComparer<string>
    {
        public int Compare(string x, string y)
        {
            if (x == null)
            {
                if (y == null)
                {
                    // If x is null and y is null, they're
                    // equal.
                    return 0;
                }
                else
                {
                    // If x is null and y is not null, y
                    // is greater.
                    return -1;
                }
            }
            else
            {
                // If x is not null...
                //
                if (y == null)
                    // ...and y is null, x is greater.
                {
                    return 1;
                }
                else
                {
                    // ...and y is not null, compare the
                    // lengths of the two strings.
                    //
                    int retval = x.Length.CompareTo(y.Length);

                    if (retval != 0)
                    {
                        // If the strings are not of equal length,
                        // the longer string is greater.
                        //
                        return retval;
                    }
                    else
                    {
                        // If the strings are of equal length,
                        // sort them with ordinary string comparison.
                        //
                        return x.CompareTo(y);
                    }
                }
            }
        }
    }

    public class Example
    {
        public static void Main()
        {
            List<string> dinosaurs = new List<string>();
            dinosaurs.Add("Pachycephalosaurus");
            dinosaurs.Add("Amargasaurus");
            dinosaurs.Add("Mamenchisaurus");
            dinosaurs.Add("Deinonychus");
            Display(dinosaurs);

            DinoComparer dc = new DinoComparer();

            Console.WriteLine("\nSort with alternate comparer:");
            dinosaurs.Sort(dc);
            Display(dinosaurs);

            SearchAndInsert(dinosaurs, "Coelophysis", dc);
            Display(dinosaurs);

            SearchAndInsert(dinosaurs, "Oviraptor", dc);
            Display(dinosaurs);

            SearchAndInsert(dinosaurs, "Tyrannosaur", dc);
            Display(dinosaurs);

            SearchAndInsert(dinosaurs, null, dc);
            Display(dinosaurs);
        }

        private static void SearchAndInsert(List<string> list,
            string insert, DinoComparer dc)
        {
            Console.WriteLine("\nBinarySearch and Insert \"{0}\":", insert);

            int index = list.BinarySearch(insert, dc);

            if (index < 0)
            {
                list.Insert(~index, insert);
            }
        }

        private static void Display(List<string> list)
        {
            Console.WriteLine();
            foreach( string s in list )
            {
                Console.WriteLine(s);
            }
        }
    }

    /* This code example produces the following output:

    Pachycephalosaurus
    Amargasaurus
    Mamenchisaurus
    Deinonychus

    Sort with alternate comparer:

    Deinonychus
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus

    BinarySearch and Insert "Coelophysis":

    Coelophysis
    Deinonychus
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus

    BinarySearch and Insert "Oviraptor":

    Oviraptor
    Coelophysis
    Deinonychus
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus

    BinarySearch and Insert "Tyrannosaur":

    Oviraptor
    Coelophysis
    Deinonychus
    Tyrannosaur
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus

    BinarySearch and Insert "":


    Oviraptor
    Coelophysis
    Deinonychus
    Tyrannosaur
    Amargasaurus
    Mamenchisaurus
    Pachycephalosaurus
     */

     

     

    http://msdn2.microsoft.com/en-us/library/234b841s.aspx

     

    C'est très simple comme concept, et dans ta fonction compare tu peux mettre ce que tu veux!

    mardi 27 novembre 2007 18:32
    Modérateur