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 :

Trier List<string> en fonction d'une List<string>


Sujet :

C#

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 14
    Par défaut Trier List<string> en fonction d'une List<string>
    Bonjour,

    J'explique le titre dans son contexte... Je dispose d'une DataGrid que j'alimente par la connexion à une base de donnée mysql.
    Ma première colonne correspond au niveau (RDC, R+1, R+2, R+3 etc), les autres colonnes servent à le décrire. Cependant, j'ai plusieurs lignes possible pour un même niveau.
    N'ayant pas trouvé de solution me convenant pour fusionner des cellules verticalement, je souhaiterai opter pour une méthode de tri qui suivrait la logique physique de niveau à savoir : R+3 au dessus de R+2 au dessus de R+1 au dessus de RDC etc.
    En effet, comme je peux ajouter une description d'un niveau à n'importe quel moment dans ma table mysql, au moment du SELECT il me place cette nouvelle ligne en dernière ligne de ma DataGrid.

    Je ne sais pas si c'est très clair mais peut être schématiquement:
    Ce que j'ai:
    Niveau
    RDC
    R+1
    R+2
    R+3
    RDC

    Ce que je voudrais:
    Niveau
    RDC
    RDC
    R+1
    R+2
    R+3

    L'idée que je pensais donc utiliser serait au moment de récupérer les données de ma table mysql, utiliser un OrderBy("liste RDC, R+1, R+2, etc") mais je n'ai rien trouvé sur le net..

    Une âme charitable pour m'aider?
    Merci!

  2. #2
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 14
    Par défaut
    Finalement j'ai trouvé une autre méthode mais très longue et barbante, je la détaille quand même:

    J'ai ajouté un attribut "order" à ma table avec le numéro dans l'ordre dans lequel je souhaites que la ligne soit placé.
    Je crée avec une première lecture de ma table une List<string> de la taille de mon orderMAX.
    J'associe avec une deuxième lecture de ma table, la List<string> associée au n° order à List<string>[order].

    Ca fonctionne mais ça me fait faire beaucoup de lecture pour pas grand chose je trouve, si qqun a une autre solution plus directe je reste preneuse! Merci.

  3. #3
    Membre émérite Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Par défaut
    Salut,

    En général, on aura tendance à créer deux tables :

    - Une table de valeur référentielle qui contiendra les codes (RDC, R+1, R+2, R+3) ainsi que l'ordre de tri.
    - Une table contenant les enregistrements utilisant ces codes (la table que tu as actuellement en somme).

    Ça présente plusieurs avantages :

    - Pouvoir faire un tri de ta deuxième table en faisant une jointure sur la première et en triant sur l'ordre.
    - Lors de l'enregistrement d'une ligne dans la deuxième table, d'avoir une liste exhaustive des codes simplement en affichant la première table.

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 14
    Par défaut
    Merci,
    Justement c'est plutôt l'idée de la démarche que j'avais mais j'ai seulement 1 mois d'expérience en C#, WPF, SQL, etc donc je me retrouve bloquée pour la traduction de tout cela en code...

  5. #5
    Membre émérite Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Par défaut
    Je comprends,

    Hésites pas du coup à poser des questions et à jeter un oeil aux cours et tutoriel du forum.

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 14
    Par défaut
    Euuuuuuuuh... ben justement, je pensais que c'était l'intérêt d'ouvrir un sujet sur le forum, qu'on me donne des pistes de code, de fonctions à utiliser...

  7. #7
    Membre émérite Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Par défaut
    C'est le but oui, mais y'a aussi pas mal de tuto qui peuvent t'aider sur les différentes technos que tu utilise.

  8. #8
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 14
    Par défaut
    Oui et cela fait d'ailleurs plusieurs jours déjà que j'ai passé à rechercher sur le net, tutos, forum sans rien trouver qui ne me propose une solution plus simple que ce que j'ai finalement utilisé.
    C'est la raison pour laquelle je me suis décidée à ouvrir un sujet afin de m'être utile à moi mais également d'autres personnes étant donné que je n'ai pas retrouvé le même problème.

    Je ne pensais pas que ma manière de me former en autodidacte y serait débattue..

  9. #9
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Pourquoi est-ce-qu'un simple order by dans une requête sql ne fonctionne pas ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select etage, description from niveau order by etage

    Et puis je ne me vois pas remplir une table de référentiel avec 102 étages pour pouvoir gérer l'Empire State Building ; on a ici une notion de numéro, pas de code.

  10. #10
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 14
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Pourquoi est-ce-qu'un simple order by dans une requête sql ne fonctionne pas ?
    Parce que le type de tri ne respecte pas un simple tri alphabétique ou numérique croissant/décroissant.

  11. #11
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 470
    Par défaut
    Bonjour,
    Il est tout à fait possible d'utiliser un tri "à façon" en C#, avec List.Sort(IComparer<T>).
    Il suffit de créer une classe qui implémente l'interface IComparer.
    Plus d'infos ici.

    Tatayo.

  12. #12
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 011
    Par défaut
    Citation Envoyé par Noxen
    Pourquoi est-ce-qu'un simple order by dans une requête sql ne fonctionne pas ?
    Citation Envoyé par Shoupine Voir le message
    Parce que le type de tri ne respecte pas un simple tri alphabétique ou numérique croissant/décroissant.
    avec les données suivante :
    |Id|Etage|Description |
    -------------------------------
    | 2|R + 2| Deuxième |
    | 3|R + 3| Troisième |
    | 1|R + 1| Premier |
    | 0|RDC | Rez de chaussée|

    Sur tous les SGBDR que je connais un 'order by Id asc' me trie mes étage par ordre croissant et correctement....
    Je ne sais pas quel SGBDR tu utilise mais change-en si le tri ne fonctionne pas.

  13. #13
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 14
    Par défaut
    Merci à tous pour votre aide,

    popo le soucis c'est que ma liste de chaine est en réalité plus complexe que cela puisque pour reprendre ton exemple, elle combine deux "types" de chaine:
    |R + 2| Deuxième |
    |PH R + 2| Deuxième |
    |R + 3| Troisième |
    |PH R + 3| Troisième |
    |R + 1| Premier |
    |PH R + 1| Premier |
    |RDC | Rez de chaussée|
    |PH RDC | Rez de chaussée|

    Finalement, j'ai trouvé une solution en gardant mon principe d'ID associé pour l'ordre puis en utilisant le principe de Group de DataGrid pour avoir l'équivalent d'une cellule fusionnée et donc autant de lignes que je veux par "nom d'étage" (https://docs.microsoft.com/en-us/dot...tagrid-control)

  14. #14
    Membre émérite Avatar de Momoth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 318
    Par défaut
    Citation Envoyé par popo Voir le message
    Sur tous les SGBDR que je connais un 'order by Id asc' me trie mes étage par ordre croissant et correctement....
    Je ne sais pas quel SGBDR tu utilise mais change-en si le tri ne fonctionne pas.
    Hum, mauvaise idée à mon avis. Un identifiant ne sert pas à trier une liste. De plus, tu n'as généralement pas la main sur l'identifiant. Ce sera un simple auto incrément. Auquel cas, tu te retrouvera embêter si par la suite tu rajoute un étage de style sous sol ou entre étage car leurs identifiants seront les derniers mais tu voudra les afficher avant.

  15. #15
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Citation Envoyé par Momoth Voir le message
    Hum, mauvaise idée à mon avis. Un identifiant ne sert pas à trier une liste. De plus, tu n'as généralement pas la main sur l'identifiant. Ce sera un simple auto incrément. Auquel cas, tu te retrouvera embêter si par la suite tu rajoute un étage de style sous sol ou entre étage car leurs identifiants seront les derniers mais tu voudra les afficher avant.
    Tout à fait d'accord ; d'autant qu'un GUID peut aussi servir d'identifiant et là il n'est pas question d'avoir un ordonnancement chronologique. Dans le cas d'espèce, puisque la table sert à décrire des étages, il serait parfaitement logique d'avoir une colonne numérique qui précise le numéro de l'étage, et qui permette de faire dessus un classement ordonné, puisque in fine c'est effectivement ce que souhaite faire Shoupine.

  16. #16
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 011
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Tout à fait d'accord ; d'autant qu'un GUID peut aussi servir d'identifiant et là il n'est pas question d'avoir un ordonnancement chronologique. Dans le cas d'espèce, puisque la table sert à décrire des étages, il serait parfaitement logique d'avoir une colonne numérique qui précise le numéro de l'étage, et qui permette de faire dessus un classement ordonné, puisque in fine c'est effectivement ce que souhaite faire Shoupine.
    Sérieusement les gars, il faut savoir extrapoler.
    OK, si l'id ne doit pas servir au tri (même si j'ai dans l'idée que des étages, ils doivent pas en rajouter souvent) tu stockes les valeur servant pour le tri dans une autre colonne et ta table aurait les colonnes Id, Numero, Etage et Description et ça fonctionnerai tout aussi bien.


    Citation Envoyé par Shoupine
    popo le soucis c'est que ma liste de chaine est en réalité plus complexe que cela puisque pour reprendre ton exemple, elle combine deux "types" de chaine:
    |R + 2| Deuxième |
    |PH R + 2| Deuxième |
    |R + 3| Troisième |
    |PH R + 3| Troisième |
    |R + 1| Premier |
    |PH R + 1| Premier |
    |RDC | Rez de chaussée|
    |PH RDC | Rez de chaussée|
    Bon j'ai vu que tu avait résolu ton problème. C'est super.
    J'ai juste une petite remarque parce que j'avoue ne pas comprendre pourquoi tu t'embête à travailler sur des chaines.
    Si au lieu d'avoir une liste de chaîne tu avais une liste d'objet tu pourrais trier sur l'une des propriétés de ces objets (voire plusieurs).
    Et pour obtenir ta chaîne combinée, une simple surcharge de la méthode ToString() fera l'affaire.

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 22/12/2016, 10h15
  2. Réponses: 2
    Dernier message: 12/06/2014, 15h18
  3. inserer une liste de personne dans un champ d'une liste
    Par must19 dans le forum SharePoint
    Réponses: 1
    Dernier message: 02/09/2008, 10h12
  4. Réponses: 1
    Dernier message: 30/06/2008, 12h55
  5. Réponses: 7
    Dernier message: 28/06/2007, 11h08

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