Trier une List d'objet simplement [Résolu]

CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - 16 déc. 2011 à 19:35 - Dernière réponse : CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention
- 10 mai 2014 à 22:50
Bonsoir a tous,
Ceci n'est pas une question mais plus une présentation de la class IEnumerable
do,t je vien de trouver une utilisation intéressante.

Je vous présente avec cette Class une manière de trier une liste d'objet rapide et simple

Par exemple ici Trier une liste de points par ses coordonnées en X

Dim Dict As List(Of Point)
... j'ajoute des données dans le List puis je tri de cette manière:

Dim DictTrié As IEnumerable(Of Point) = Dict.OrderBy(Function(Point) Point.X)

Est ce que cette méthode vous parait rapide et fiable ? (comparatif)
As t'elle des défauts?
Cordialement CGSI3
Afficher la suite 

6 réponses

Répondre au sujet
NHenry 14134 Messages postés vendredi 14 mars 2003Date d'inscription 23 avril 2018 Dernière intervention - 17 déc. 2011 à 16:49
+3
Utile
Bonjour,

Pour le OrderBy, tu as affiché ou utilisé les données ?
Car en LINQ, les données sont calculées au moment de l'utilisation, pas avant.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NHenry
NHenry 14134 Messages postés vendredi 14 mars 2003Date d'inscription 23 avril 2018 Dernière intervention - 16 déc. 2011 à 20:50
0
Utile
Bonjour,

En fait, tu utilises LINQ, OrderBy est une fonction d'extension.
Concernant le ratio Complexité du code / Vitesse, ça reste convenable.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, ce lien ou encore celui-ci[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Commenter la réponse de NHenry
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - 17 déc. 2011 à 13:52
0
Utile
Bonjour NHenry,
Voici un petit BenchMark en Vb.Net 2008 de procedure de tri par 3 méthodes

Tri effectué sur 1 000 000 éléments
La premiere (Tableau de double) par cette fonction quicksort : 1622 millisecondes
Dim tri() As Double
Quicksort(tri)

   Public Sub Quicksort(ByVal t() As Double, Optional ByVal loBound As Integer Integer.MaxValue, Optional ByVal upBound As Integer Integer.MinValue)
        ' http://www.visionduweb.com/cours/ipi/divers_net/Puissance_VB_Net.htm
        ' http://faq.vb.free.fr/index.php?question=151
        Dim med_value As Double, hi As Integer, lo As Integer, i As Integer
        If loBound Integer.MaxValue Then loBound t.GetLowerBound(0)
        If upBound Integer.MinValue Then upBound t.GetUpperBound(0)
        If loBound >= upBound Then Exit Sub
        Dim op As New Random
        i = Convert.ToInt32(Int((upBound - loBound + 1) * op.NextDouble + loBound)) 'rnd fourni un aléatoire
        med_value t(i) : t(i) t(loBound)
        lo loBound : hi upBound
        Do
            Do While t(hi) >= med_value
                hi = hi - 1 : If hi <= lo Then Exit Do
            Loop
            If hi <= lo Then
                t(lo) = med_value : Exit Do
            End If
            t(lo) t(hi) : lo lo + 1
            Do While t(lo) < med_value
                lo = lo + 1 : If lo >= hi Then Exit Do
            Loop
            If lo >= hi Then
                lo hi : t(hi) med_value
                Exit Do
            End If
            t(hi) = t(lo)
        Loop
        Quicksort(t, loBound, lo - 1) ' Recursive calls  
        Quicksort(t, lo + 1, upBound)
    End Sub



La seconde (Liste de double) par la fonction .sort : 140 millisecondes
Dim tri As New List(Of Double)
tri.sort

La troisieme (liste de point) par cette fonction .OrderBy : 15 millisecondes
Dim dict As New List(Of Point)
...
Dim DictTrié As IEnumerable(Of Point) = dict.OrderBy(Function(point) point.X)
Cet essai n'est pas completement rigoureux avec les éléments triés mais il indique des pistes a suivre.
En esperant ne pas avoir fais d'erreur ..
Si quelqu'un fais des essais en ce domaine n'hésitez pas a nous en faire profiter.
Bonne journée CGSI3
Commenter la réponse de CGSI3
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - 3 janv. 2012 à 09:34
0
Utile
Bonjour,
Correctif:

Exact NHenry,<
Tu est toujours d un grand secours,
la fonction Linq doit ensuite etre executer par l execution d'une opération quelconque sur la variable dict par exemple l'affichage d'un élément du tableau.
Ce qui ramene ce benchmark pour la methode Orderby a environ 600ms pour cet exemple.
Mais il faut garder a l'esprit que je tri une liste Simple par la methode Sort et des points (2 éléments x et y) pour OrderBy.
Commenter la réponse de CGSI3
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - Modifié par CGSI3 le 10/11/2013 à 09:28
0
Utile
Bonjour a tous,
Ceci est juste une petite remarque

j'ai posté une fonction QuickSort, il y a 2 ans maintenant, qui fonctionnait sur le site.
Je reviens a ce jour sur ce post pour dire que lorsque j'essai de la récupérer, je m'aperçois que plein de "=" ou de "<>" sont supprimés du code

Est ce moi qui ai mal posté a l'époque ou la migration s'est mal effectuée ? je fini par avoir des doutes ...

Cependant Quicksort comme ceci est largement trop lent,
voici une méthode de tri d'un ArrayList d'Objets possédant la propriété Name. Indiquez moi si vous trouvez mieux.

    Public Sub SortByName(byref ArrayList as ArrayList )
        Dim dict As New List(Of Object)
        dict = ArrayList.ToArray.ToList()
        Dim DictTrié As IEnumerable(Of Object) = dict.OrderBy(Function(x) x.name)
        ArrayList = New ArrayList(DictTrié.ToArray)
    End Sub


--
Commenter la réponse de CGSI3
CGSI3 417 Messages postés vendredi 22 février 2008Date d'inscription 7 janvier 2018 Dernière intervention - 10 mai 2014 à 22:50
0
Utile
Bsoir a tous,

Petite précision pour le code au dessus

Il faut avoir le framework 3.5 et ajouter

Imports System.Linq

Bonne Prog
CGSI3

--
Commenter la réponse de CGSI3

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.