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 :

[algo] insérer une colonne dans un tableau


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 136
    Points : 65
    Points
    65
    Par défaut [algo] insérer une colonne dans un tableau
    bonjour,

    aujourd'hui mon soucis (qui reléve plus de la logique que du langage) c'est d'insérer une colonne dans un tableau à 2 dimensions. la première dimensions ce sont les lignes et la deuxième les colonnes. le contenu de ce tableau est destiné à être inscrit dans un fichier CSV.

    en fait, mon appli doit rechercher un libellé précis et insérer après une colonne, et je ne parviens pas à écrire une méthode permettant cette action.

    si vous connaissez un algo permettant de réaliser cette action, merci de m'en faire part. et merci de m'avoir lu

  2. #2
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Salut,

    Si j'ai bien compris ton problème :

    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
     
    // ton tableau à 2 dimensions de départ, déjà instancié
    string[,] tableauOrigine = new string [lignes,colonnes];
     
    // tu veux ajouter une colonne après un libellé précis
    string myLibelle = "blabla";
    bool trouve = false;
    int cpt = 0; // indice de la colonne contenant le libellé
    int lineWhere = x; // indice de la ligne ou se trouve ta colonne (si tu la connais, sinon tu parcours aussi toutes les lignes dans la boucle en dessous)
     
    while (!trouve && cpt < tableauOrigine.GetLength(1)){
     
    	if (tableauOrigine[lineWhere,cpt] == myLibelle)
    		trouve = true;
     
    	cpt++;
    }
    cpt--;
     
    if (trouve)
    {
    	string[,] newTableau = new string [lignes,colonnes + 1];
     
    	// tu remplis avec les anciennes valeurs pour tout ce qui se trouve avant la nouvelle colonne
    	for (int i =0; i < tableauOrigine.GetLength(0); i++)
    	{
    		for (int j =0; j <= cpt; j++)
    		{
    			newTableau[i,j] = tableauOrigine[i,j];
    		}
    	}
     
    	// tu insère la nouvelle colonne à vide
    	for (int k =0; k < tableauOrigine.GetLength(0); k++)
    		newTableau[k,cpt+1] = "";	
     
    	// tu complète avec le reste de l'ancien tableau, attention au décalage des indices
    	for (int l =0; l < tableauOrigine.GetLength(0); l++)
    	{
    		for (int m =cpt+2; m < tableauOrigine.GetLength(1) + 1; m++)
    		{
    			newTableau[i,m] = tableauOrigine[l,m-1];
    		}
    	}
     
    	tableauOrigine = newTableau;
    }
    Cependant, je suis sur qu'il y'a des solutions 10 fois plus élégantes

    @+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 136
    Points : 65
    Points
    65
    Par défaut
    merci beaucoup d'avoir pri le temp de me répondre, c'est sympa

    dans ma tête j'avais eu la même idée que toi, mais j'ai pas réussi à la mettre en oeuvre. enfin bref, j'ai adapté ton code à mon appli, mais il y a un problème. il semblerais que tout se passe bien jusqu'à la première colonne à remplacer, puis ça part en cacahouète.

    voici ton code modifié :
    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
     
     
                        int cpt = 0; // indice de la colonne contenant le libellé
                        int lineWhere = 0; // indice de la ligne ou se trouve ta colonne (si tu la connais, sinon tu parcours aussi toutes les lignes dans la boucle en dessous)
     
                        // tu veux ajouter une colonne après un libellé précis
                        foreach (Correspondance v in cc)
                        {
                            foreach (Regroupement reg in rcol)
                            {
                                if (reg.FkChamp == v.Id)
                                {
                                    string myLibelle = v.ChampStandard;
                                    bool trouve = false;
     
                                        while (!trouve && cpt < t.GetLength(1))
                                        {
     
                                            if (t[lineWhere, cpt] == myLibelle)
                                                trouve = true;
     
                                            cpt++;
                                        }
                                    cpt--;
                                    //MessageBox.Show(cpt.ToString());
                                    if (trouve)
                                    {
                                        string[,] newTableau = new string[t.GetLength(0), t.GetLength(1) + 1];
     
                                        // tu remplis avec les anciennes valeurs pour tout ce qui se trouve avant la nouvelle colonne
                                        for (int i = 0; i < t.GetLength(0); i++)
                                        {
                                            for (int j = 0; j <= cpt; j++)
                                            {
                                                newTableau[i, j] = t[i, j];
                                            }
                                        }
     
                                        // tu insère la nouvelle colonne à vide
                                        for (int k = 0; k < t.GetLength(0); k++)
                                        {
                                            newTableau[k, cpt + 1] = ";";
                                            newTableau[0, cpt + 1] = reg.Libelle+";";
                                        }
     
                                        // tu complète avec le reste de l'ancien tableau, attention au décalage des indices
                                        for (int l = i; l < t.GetLength(0); l++)
                                        {
                                            for (int m = cpt + 2; m < t.GetLength(1) + 1; m++)
                                            {
                                                newTableau[l, m] = t[l, m - 1] + ";.old";
                                            }
                                        }
     
                                        t = newTableau;
                                    }
                                }
                            }
                        }
    en fait j'utilise Subsonic pour gérer ma base de donnée dans laquelle les libellé de remplacement sont présent. donc Correspondances et Regroupement représentent des tables, et le if après les 2 foreache sert à ne traiter que les cas ou il y a un libeller à insérer.

    EDIT:

    j'ai viré le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (lineWhere = 0; lineWhere < t.GetLength(0); lineWhere++)
    {
    puisque les libellé ne sont que sur la premiére ligne :p, mais ça fait toujours de la bouillie de CSV

    EDIT DU CODE

  4. #4
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Le tableau est remplie n'importe comment à la fin ou ça lève une exception?

    Pasque là je vois pas, à part que la dernière boucle for imbriquée va planter si la colonne à ajouter est situé en dernière... if faut rajouter un petit controle avant, sinon l'algo me parait bon

    Bon courage et bon week-end!

    @+

  5. #5
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Si ton nombre de lignes et de colonnes peut etre variable, je te conseille vivement de travailler avec des List<> pour faire ce que tu veux faire

    Et dans le cas present une List<String> de List<String>

    Mais je ne comprends pas bien ton idée d'insertion de colonnes ?

    Soit le nombre de colone est connu a l'avance tu ne fais qu'assigner une valeur a la colonne ad-hoc


    Soit to nombre de colonne s'incremente a la volée et tu te retrouve dans la situation d'ajouter une nieme colonne a la ligne L
    Ce qui signifie que ton nombre de colonne sera variable selon les lignes
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/12/2009, 15h02
  2. Insérer une image dans un tableau
    Par aminos40 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 31/05/2007, 08h38
  3. [Tableaux] Total d'une colonne dans un tableau
    Par carmen256 dans le forum Langage
    Réponses: 4
    Dernier message: 25/03/2007, 12h42
  4. [HTML] Pb pour inserer une colonne dans un tableau
    Par cchampion2fr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 11/11/2006, 11h41
  5. insérer une colonne dans une base
    Par ludolan dans le forum Access
    Réponses: 2
    Dernier message: 21/10/2005, 11h29

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