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 :

copie de tableau boucle for [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Avril 2015
    Messages : 90
    Points : 49
    Points
    49
    Par défaut copie de tableau boucle for
    Bonjour à tous,
    Encore un petit soucis avec une boucle for pour copier un tableau de string dans un autre tableau ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int j=0;
     string[] sydm = new string[6] {"A", "", "B", "", "C", "D"};
      string[] valX = new string[7];
     
      for (var i = 0; i < sydm .GetUpperBound(0) + 1; i++)
                 {
                     if (sydm [i] != "")
                     {
                          j = j + 1; valX[j] = sydm [i];
     
                     }
                 }
    J'essaie de ranger le tableau valx de la manière suivante :
    {"A", "B", "C", "D", "", ""};
    J'arrive à copier A mais pas les autres..B ou C ..

    En VB.net ça donne un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     For i = 0 To 5
                If sydm(i) <> "" Then k = k + 1 : valX(k) = sydm(i)
            Next i
    pouvez vous me dire d’où vient l'erreur dans le code c#
    Merci de votre aide.
    Greg

  2. #2
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Avril 2015
    Messages : 90
    Points : 49
    Points
    49
    Par défaut
    Voici la solution toute bête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Symdme.CopyTo(valX, 0);


    Parfois faut savoir laisser un problème de coté et y revenir après!!!
    Greg

  3. #3
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Avril 2015
    Messages : 90
    Points : 49
    Points
    49
    Par défaut
    Bon bas çà fonctionne pas!!!!!!

  4. #4
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    Bonjour,

    Il ne faut pas forcement chercher à faire la traduction littérale du code entre deux langages .

    Donc ce que tu cherches à faire, c'est copier sydm dans valX, et ensuite trier ce dernier.

    C'est bien tu as réussi la copie par le bout de code que tu as montré, il reste ensuite à le trier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     sydm.CopyTo(valX, 0);
     
                //Tri du tableau
                Array.Sort(valX, (a, b) =>
                {
                    if (string.IsNullOrEmpty(a))
                        return 1;
                    else if (string.IsNullOrEmpty(b))
                        return -1;
     
                    return a.CompareTo(b);
                });
    J'utilise le string.isNullOrEmpty() car le tableau contient une valeur nul ( valX à une taille supérieur de 1) .

    La documentation du Array.Sort => http://www.csharp-examples.net/sort-array/

    Bon code,
    throw new NoSignatureException();

  5. #5
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Avril 2015
    Messages : 90
    Points : 49
    Points
    49
    Par défaut
    Merci WaterTwelve21 pour t'on aide..
    petit problème le tableau valx est rangé par ordre alphabétique, il faut qu'il garde l'ordre d'origine du tableau sydm.

    Si string[] sydm = new string[6] {"B", "", "D", "", "A", "E"}; alors valx {"B", "D", "A", "E", "", ""}.

    Le a.CompareTo(b) range les éléments du tableau par ordre alphabétique.
    J'essaie de trouvé un contournement au problème dans la doc que tu m'as fournis..

    Encore merci pour ton aide
    Greg

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    Par défaut
    Linq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var array = new[] { "A", "", "\t", "E", null, "C", "", "B", "  " };
    var result = array.GroupBy(s => string.IsNullOrWhiteSpace(s)).SelectMany(g => g).ToArray(); // ["A", "E", "C", "B", "", "\t", null, "", "   "]

  7. #7
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Avril 2015
    Messages : 90
    Points : 49
    Points
    49
    Par défaut
    Merci Noxen de t'on aide, je connais pas trop linq mais le code ne fonctionne pas dans tous les cas de figures:
    Si je fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     string[] array = new[] { "", "", "", "E", "", "C", "A", "B", "" };
                 string[] result = array.GroupBy(s => string.IsNullOrWhiteSpace(s)).SelectMany(g => g).ToArray();
    le code renvoie "";"";"";"";"";"E";"C";"A";"B" alors qu'il me faudrait "E";"C";"A";"B";"";"";"";"";""

    j'ai essayé avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     var result = array.Where(s => !string.IsNullOrWhiteSpace(s)).ToArray();
    mais là il m'efface les "vides" et redimensionne le tableau , ça donne "E";"C";"A";"B"

    Je suis donc repartis sur une boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     for (int i = 0; i < array.Length; i++)
                 {
                     if (array[i] != "") 
                     {                     
                         j = j + 1; valX[j] = array[i];
                     }
                 }
    qui me donne
    ""; "E";"C";"A";"B";"";"";""
    On dira que c'est un pis-aller !!!!
    Encore merci a tous pour votre aide
    Greg

  8. #8
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2015
    Messages : 26
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par gregm954 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (int i = 0; i < array.Length; i++)
    {
       if (array[i] != "") 
       {                     
          valX[j++] = array[i];
        }
    }
    Bonjour,

    Vous pouvez essayer d'incrémenter la variable j après, et non avant, d'affecter la valeur courante.
    Actuellement, étant donné que vous incrémentez j avant, le premier élément est vide. Ou alors, initialisez j à -1

    Cordialement.

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    Par défaut
    Bien vu. Effectivement, j'ai été trompé parce-que le premier élément de mon tableau n'était pas une chaîne vide, du coup c'était le premier groupe créé. Ceci-dit la correction n'est pas très compliquée (j'aurais d'ailleurs du l'envisager en premier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string[] array = new[] { "", "", "", "E", "", "C", "A", "B", "" };
    string[] result = array.OrderBy(string.IsNullOrWhiteSpace).ToArray();
    Apparemment en C# true est avant false ; ce serait probablement différent en C / C++ qui les traiteraient comme des entiers (à vérifier...). Par ailleurs en cas d'égalité sur l'évaluation de deux éléments OrderBy préserve l'ordre actuel.

  10. #10
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    J'essaie de ranger le tableau valx de la manière suivante :
    {"A", "B", "C", "D", "", ""};
    Il me semblait à la lecture que tu voulais trier dans l'ordre alphabétique, pas de soucis alors, il suffit de remplacer le compareTo par 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      Array.Sort(valX, (a, b) =>
                {
                    if (string.IsNullOrEmpty(a))
                        return 1;
                    else if (string.IsNullOrEmpty(b))
                        return -1;
     
                    return 0;
                });
    throw new NoSignatureException();

  11. #11
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    J'essaie de ranger le tableau valx de la manière suivante :
    {"A", "B", "C", "D", "", ""};
    J'arrive à copier A mais pas les autres..B ou C ..
    Deja le code vb.net comporte un erreur...l'indice j devrait être incrémenter après l'assignation au tableau valX...
    Ensuite il faut initialiser valX avec des "whitespace" ou espace blanc (< "">....
    Le tri exige une ligne de code : Array.Sort<string>(tableau);

    code behind .cs revu (ungredients: un bouton et 2 textbox):
    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
    60
    61
    62
    63
    64
     
    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                string[] sydm = new string[6] { "A", "", "C", "", "D", "B" };
                textBox1.Clear();
                //on affiche ton sydm:
                for (var i = 0; i < sydm.GetUpperBound(0) + 1; i++)
                {
                    textBox1.Text += sydm[i];
     
                }
     
                // on remplit valX de "whitespace" comme ils disent à microsoft
                string blancheneige = "";
                string[] valX = new string[sydm.Length];
                for (var i = 0; i < valX.GetUpperBound(0) + 1; i++)
                {
                    valX[i] = blancheneige;
                }
     
     
                // copie des lettres
                int j = 0;
                for (var i = 0; i < sydm.GetUpperBound(0) + 1; i++)
                {
                    if (sydm[i] != blancheneige)
                    {
                        valX[j] = sydm[i]; // indice deporté apres 
                        j = j + 1;
                    }
                }
     
                //on affiche ton valX:
                textBox1.Text += Environment.NewLine; 
                for (var i = 0; i < valX.GetUpperBound(0) + 1; i++)
                {
                    textBox1.Text += valX[i];
                }
     
                // on trie ton valX:
                textBox2.Clear();
     
                textBox2.Text += "valx trie";
                textBox2.Text += Environment.NewLine;
                //le maudit tri
                Array.Sort<string>(valX);
                for (var i = 0; i < valX.GetUpperBound(0) + 1; i++)
                {
                    textBox2.Text += valX[i];
                }
            }
     
     
        }
    }
    bon code...

  12. #12
    Membre confirmé Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Points : 461
    Points
    461
    Par défaut
    @MABROUKI

    Cela fait beaucoup de bricolage pour un simple tri non ?

    Et je précise que son tableau de copie n'a pas la même taille que celui d'origine ( pourquoi ? aucune idée )

    string[] sydm = new string[6] {"A", "", "B", "", "C", "D"};
    string[] valX = new string[7];
    throw new NoSignatureException();

  13. #13
    Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2015
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Avril 2015
    Messages : 90
    Points : 49
    Points
    49
    Par défaut
    Bonjour à tous,
    WaterTwelve21, pour la taille du tableau , au départ la boucle for que j'avais écrite étant mal foutu, elle écrivait à l'indice 1 du tableau et non pas 0...je sais pas si je suis bien claire!!!
    Bon en tous cas, le code de Noxen , fonctionne bien..en tous cas pour l'instant je n'ai pas détecté d'erreur .

    Merci encore à tous d'avoir pris un peu de temps pour mon problème.
    Bonne journée
    Greg

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

Discussions similaires

  1. Boucles for et tableau
    Par hugobosscool26 dans le forum C#
    Réponses: 9
    Dernier message: 16/02/2008, 23h30
  2. Réponses: 9
    Dernier message: 15/09/2006, 19h08
  3. Réponses: 3
    Dernier message: 04/08/2006, 19h24
  4. [VB.net] Boucle for next avec un tableau
    Par grand_prophete dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 11h08
  5. boucle for n fois pour n tableau...
    Par toyyo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/08/2005, 16h01

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