IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Sort sur Arraylist longue durée


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut Sort sur Arraylist longue durée
    Bonjour à tous.

    Je récupère les fichiers d'un dossier.
    Malheureusement le fait qu'ils soient donnés par ordre alphabétique n'est pas garanti.

    J'ai donc décidé d'utiliser un sort sur une arraylist, mais le problème c'est que pour environ 1000 lignes le Sort prend 1 minute 30 secondes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IComparer aComp = new FileComparer();
                monArray.Sort(aComp);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    public class FileComparer : IComparer 
        {
            public int Compare(object x, object y) 
            {
                try
                {
                    FileInfo aFirstFile = new FileInfo((string)x);
                    FileInfo aSecondFile = new FileInfo((string)y);
     
                    string aFirstString = aFirstFile.Name.Replace(aFirstFile.Extension, "");
                    string aSecondString = aSecondFile.Name.Replace(aSecondFile.Extension, "");
     
                    int aFirstInt = Convert.ToInt32(aFirstString);
                    int aSecondInt = Convert.ToInt32(aSecondString);
     
                    if (aFirstInt == aSecondInt)
                    {
                        return 0;
                    }
                    else if (aFirstInt > aSecondInt)
                    {
                        return 1;
                    }
                    else
                    {
                        return -1;
                    }
                }
                catch
                { return 0; }
     
            }
        }
    Il y aurait il une erreur dans mon code?

    Merci.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2009
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 229
    Par défaut
    Bonjour,
    Je pense c'est le temps d'exécution de la fonction qui pose le problème.
    Pour cela, je te suggère d'utiliser : ou bien

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Oulala !

    C'est quoi ce compareur alambiqué ?
    C'est certainement là que tu prends du temps

    Ta liste c'est une liste de nom de fichier ?
    A priori tu dois juste comparer deux chaines non ?
    Donc faire un CompareTo devrait sufire

    Et travailler Avec une List<> et pas un ArrayList

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2009
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 229
    Par défaut
    Citation Envoyé par olibara Voir le message
    Oulala !
    Et travailler Avec une List<> et pas un ArrayList
    C'est quoi l'avantage d'utiliser List<> au lieu de ArrayList ?

    Merci

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    L'ArrayList devient Obsolete
    Mais ton problème c'est surtout ta methode de comparaison
    Et puis pourquoi travailler avec des object ?
    Tes entitées sont parfaitement typées et devraient etre des string de noms !
    Non ?

    Je récupère les fichiers d'un dossier.
    Tu recupère quoi et comment ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    Citation Envoyé par olibara Voir le message
    Oulala !

    C'est quoi ce compareur alambiqué ?
    C'est certainement là que tu prends du temps

    Ta liste c'est une liste de nom de fichier ?
    A priori tu dois juste comparer deux chaines non ?
    Donc faire un CompareTo devrait sufire

    Et travailler Avec une List<> et pas un ArrayList
    Rien que d'utiliser CompareTo me donne un résultat quasi-instantané.
    J'étais à fond dans la numérotation de mes fichiers, ça m'a un peu perdu.

    Merci.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    Voici le nouveau traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public int Compare(object x, object y) 
            {
                try
                {
                    return x.ToString().CompareTo(y.ToString());
                }
                catch
                { return 0; }
     
            }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Par défaut
    Au sujet du tri, est-il préférable de créer un Comparer ou bien le code suivant est équivalent ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<System.IO.FileInfo> fileInfolist = new List<System.IO.FileInfo>();
     
    /* Fill list */
     
    fileInfolist.OrderBy(fi => fi.Name);
    Est-ce moins/plus performant ? Moins/plus gourmand ?

  9. #9
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par Gat- Voir le message
    Au sujet du tri, est-il préférable de créer un Comparer ou bien le code suivant est équivalent ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<System.IO.FileInfo> fileInfolist = new List<System.IO.FileInfo>();
     
    /* Fill list */
     
    fileInfolist.OrderBy(fi => fi.Name);
    Est-ce moins/plus performant ? Moins/plus gourmand ?


    Le comparer est utile si la methode de comparaison utilise un algorithme particulier.

    Dans le cas present ta proposition est tout a fait equivallente
    Et pour NejNej, tant mieux si ca devient acceptable
    Mais j'eviterais quand meme de comparer des objets en jouant avec Tostring()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public int Compare(FileInfo x, FileInfo y) 
    {
              try
             {
                 return x.Name.CompareTo(y.Name);
             }
             catch
             { 
                return 0;
             }
     
    }

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    Mais l'interface IComparer réclame la signature Compare(object,object)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Disque Dur] Des retours longue durée sur les SSD ?
    Par comode dans le forum Périphériques
    Réponses: 0
    Dernier message: 21/11/2009, 03h52
  2. Worfkflow sur une longue durée
    Par BATCHOS CON TEQUILA dans le forum Windows Workflow Foundation
    Réponses: 6
    Dernier message: 12/02/2009, 18h06
  3. Requête Longue durée sur un Serveur
    Par faressam dans le forum Administration
    Réponses: 3
    Dernier message: 10/07/2008, 09h42
  4. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  5. copier la RAM sur le Disque dure
    Par azman0101 dans le forum Windows
    Réponses: 13
    Dernier message: 21/06/2004, 01h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo