Trier une List d'objet simplement

Résolu
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 - 16 déc. 2011 à 19:35
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 - 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
A voir également:

6 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
17 déc. 2011 à 16:49
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
---
3
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
16 déc. 2011 à 20:50
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
---
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
17 déc. 2011 à 13:52
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
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
3 janv. 2012 à 09:34
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
Modifié par CGSI3 le 10/11/2013 à 09:28
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


--
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
10 mai 2014 à 22:50
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

--
0
Rejoignez-nous