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 :

Renommer automatiquement une entrée si elle existe déjà dans une liste avant de l’insérer.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de viktor56
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 32
    Par défaut Renommer automatiquement une entrée si elle existe déjà dans une liste avant de l’insérer.
    Bonjour,

    J’ai écrit un script qui fait bien ce que je lui demande, c’est-à-dire chercher si un nom existe dans une liste et le renommer si c’est le cas.

    Dans mon exemple, le résultat est N8… Mais je me rends bien compte que tout ça n’est pas optimisé, la liste est parcourue à chaque changement de nom de mon entrée, depuis le début, jusqu’à ce qu’il arrive enfin au nom qui n’est pas utilisé.

    Je me demandais donc si quelqu’un pourrait me mettre sur la voie de l’optimisation de ce script. J’ai pensé à un Icomparer, je ne sais pas si c’est la bonne et la meilleure chose à faire.

    Merci d’avance pour votre aide.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    using System;
    using System.Collections.Generic;
    using System.Linq;
     
    namespace TestDoublon
    {
        class Program
        {
            private static List<string> Nom = new List<string>();
            public static string NouvelleEntree { get; set; }
            private static void Main(string[] args)
            {
                Nom.Add("Texte");
                Nom.Add("TexteN1");
                Nom.Add("TexteN6");
                Nom.Add("TexteN5");
                Nom.Add("TexteN3");
                Nom.Add("TexteN4");
                Nom.Add("TexteN20");
                Nom.Add("TexteN19");
                Nom.Add("TexteN7");
                Nom.Add("TexteN2");
     
                NouvelleEntree = "Texte";
     
                chercherDoublon();
                Console.WriteLine(NouvelleEntree);
                Console.Read();
            }
            private static void chercherDoublon()
            {
                foreach (string NomDejaDansListe in Nom)
                {
                    if (NouvelleEntree == NomDejaDansListe)
                    {
                        var FinChaine = NouvelleEntree.Split('N').Last();
     
                        if (FinChaine == NouvelleEntree) 
                        { 
                            FinChaine = "N1";
                            NouvelleEntree = NouvelleEntree + FinChaine;
                        }
                        else 
                        { 
                            int CountFinChaine = FinChaine.Count();
                            int CountChaineComplete = NouvelleEntree.Count();
     
                            string NouveauDebutChaine = NouvelleEntree.Substring(0, CountChaineComplete-CountFinChaine);
     
                            int NouveauFinChaine = Convert.ToInt16(FinChaine) + 1;
     
                            NouvelleEntree = NouveauDebutChaine + NouveauFinChaine;
                            chercherDoublon();
                        }
                    }
                }
            }
        }
    }

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2003
    Messages : 79
    Par défaut
    Je penses que ton traitement devrait se faire en 2 temps

    - Verifier la presence de l'élement dans la liste en utilisant la méthode Contains de List<string>
    - Renommer ton élément et l'insérer

    Pour ce 2eme point, je ne suis pas sur de ce que tu veux faire... Tu veux le suffixer par Nx avec x qui s'auto-incrémente ?

    Tu peux utiliser Linq pour lister tous les enregistrements commencant par ta nouvelle entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var query = Nom.Where(name => name.StartsWith(NouvelleEntree));
    Tu peux faire ensuite un
    pour obtenir le nombre d'enregistrements et définir la valeur de x

    A ta disposition pour plus de renseignements

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Tu peux créer une liste personnalisée (en héritant de IList<T> par exemple). Cela te permettra de personnaliser le comportement de la méthode Add (entre autre) pour qu'elle fasse cette vérification. Voici un exemple basique pour te donner une idée :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class CustomList : IList<string>
    {
        public void Add(string item)
        {
            if (this.Contains(item))
            {
                // Ici tu gères le cas où l'entrée existe déjà
            }
            else
            {
                // Si c'est ok, on ajoute
                this.Add(item);
            }
        }
    }
    Bien sur il faudra aussi implémenter d'autres méthodes provenant ICollection<T>, de IList<T>, de IEnumerable<T> et de IEnumerable. Je les ai volontairement omises ici pour ne pas t'embrouiller l'esprit.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Membre averti Avatar de viktor56
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 32
    Par défaut
    Merci euyeusu, tu as bien compris ce que je veux faire.

    Merci à toi aussi, DotNetMatt.

    Je vais essayer vos deux propositions et puis tester ce que ça donne au niveau efficacité.

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/04/2010, 14h55
  2. Réponses: 2
    Dernier message: 29/09/2009, 15h33
  3. Réponses: 1
    Dernier message: 22/06/2008, 22h47
  4. Supprimer une colonne d'une feuille si elle est vide dans une autre
    Par xave dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 27/02/2008, 14h05
  5. Réponses: 2
    Dernier message: 05/10/2007, 23h49

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