Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] replace et les tableau

Sujet résolu
    25 mars 2012 à 10:16:39

    Bonjour à tous,

    Afin d'obtenir un peut d'aide, je me permet de vous exposer mon problème.

    En premier lieu voici le code qui me pose problème, je vous l'expliquerais un peut plus en dessous :

    case "2":
    
         //Je doit transformer maPhrase en remplacant toutes les caractère par remplacerParCaractère
    
        char[] remplacerParCaractere = new char[] { 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a' };
        char[] caractere = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
        
        //Transformation de ma variable string en tableau, afin de pouvoir faire une comparaison avec d'autres tableau
    
        string[] myArray= new string[maPhrase.Length];
    
        for (int x = 0; x < myArray.Length; x++)
            {
                myArray[x] = myArray[x].ToString();
            }
    
        //Maintenant que notre chaine string est un tableau nous pouvons la comparer à nos deux tableaux...
    
        myArray.Replace(caractere, remplacerParCaractere); //POURQUOI Y A PAS REPLACE DANS ARRAY HEINNNN ???? !!!!
    
    break;
    


    Donc je souhaiterais transformer le message stocker dans maPhrase en transformant les a par des b, des b par des c... J'ai donc fait deux tableau indiquant en quoi je souhaiter transformer chacun des caractère, j'ai aussi transformer ma variable string contenant le message en tableau afin de pouvoir interagir avec mes trois tableaux.

    Enfin je me sert de replace, afin d'indiquer que je veut remplacer les caractère par le tableau remplacerParCaractere.

    Hors j'ai le message d'erreur suivant :

    Citation : Message d'erreur

    Erreur 1 'System.Array' ne contient pas une définition pour 'Replace' et aucune méthode d'extension 'Replace' acceptant un premier argument de type 'System.Array' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante ?) C:\Users\Michael\Documents\Visual Studio 2010\Projects\EncodeurDecodeurCSharp.cs 85 13 EncodeurDecodeur



    Comment puis-je donc faire afin de pouvoir me servir de Replace ?

    Je vous remercie d'avance pour votre aide et je reste disponible pour d'éventuelles renseignements supplémentaire.

    Cordialement,
    LordZerty.
    • Partager sur Facebook
    • Partager sur Twitter
      25 mars 2012 à 12:12:59

      Si je comprends bien, tu as présenté tes données sous forme de tableaux pour pouvoir utiliser une méthode Array.Replace... qui n'existe pas. Qu'est-ce qui t'a fait croire qu'elle existerait au départ ? L'habitude d'un autre langage ? :o
      De plus il y a deux autres problèmes dans ton code. D'abord ceci :
      char[] remplacerParCaractere = new char[] { 'b', 'c', 'd', ... , 'a' };
      char[] caractere = new char[] { 'a', 'b', 'c', ... , 'z' };
      

      Utiliser deux tableaux séparés pour représenter les caractères "avant/après" n'est pas vraiment une bonne idée. Il existe une structure de données plus appropriée : les Dictionary<char, char>.

      using System.Collections.Generic;
      ...
      
      var changes = new Dictionary<char, char>() {
          { 'a', 'b' }, // a -> b
          { 'b', 'c' }, // b -> c
          { 'c', 'd' },
          ...
          { 'z', 'a' }, // z -> a
      };
      

      A noter qu'il existe plusieurs autres façons plus courtes d'initialiser le même dictionary. Par exemple ici comme le résultat revient à décaler chaque lettre d'une position, tu pourrais écrire ceci :
      var changes = new Dictionary<char, char>();
      for(char c = 'a'; c < 'z'; c++)
          changes[c] = (char)(c+1);
      changes['z'] = 'a';
      

      Donc ici ton dictionnaire pourra être indexé par un caractère entre 'a' et 'z', et la valeur sera le caractère associé.

      Second problème :
      string[] myArray= new string[maPhrase.Length];
      for (int x = 0; x < myArray.Length; x++)
      {
          myArray[x] = myArray[x].ToString();
      }
      

      Ce code ne fait rien - enfin si : il plante.

      La première ligne consiste à allouer un tableau (de strings) dont la taille est celle de ta phrase. OK.
      Ensuite tu boucles sur ton tableau (vide) et tu fais
      myArray[x] = myArray[x].ToString();
      

      Avis aux débutants qui nous regardent : ceci n'a aucune chance de faire quelque chose de bon. :)
      Déjà, à ce stade ton tableau est vide. Il contient "maPhrase.Length" valeurs null. Donc myArray[x] vaut null. Donc faire myArray[x].ToString(); va logiquement planter (avec une NullReferenceException).

      Mais bon, admettons que myArray[x] ne valait pas null, mais une string quelconque (puisque myArray est un tableau de strings). Appelons cette string "str". On aurait donc :
      str = str.ToString();
      

      ... C'est censé faire quelque chose d'utile ? :o

      De manière générale tu ne peux de toute façon pas "remplacer" une variable par la même variable avec un autre type, puisqu'en C# chaque variable est fortement typée et son type ne peut pas changer. Il n'est pas possible d'écrire ceci par exemple :

      int n = 3;
      n = n.ToString(); // j'essaie (sans succès) de transformer n en string
      n = (string)n; // autre tentative vouée à l'échec
      


      Dernier problème, que tu as décrit toi-même : la méthode Array.Replace n'existe pas. :) Mais si tu as un dictionnaire sous la main, tu n'en as pas besoin :

      var changes = new Dictionary<char, char>();
      for(char c = 'a'; c < 'z'; c++)
          changes[c] = (char)(c+1);
      changes['z'] = 'a';
      
      string taPhrase = "coucou";
      
      char[] lettresNouvellePhrase = new char[taPhrase.Length];
      for(int i = 0; i < taPhrase.Length; i++)
      {
          char lettre = taPhrase[i];
          lettresNouvellePhrase[i] = changes[lettre];
      }
      
      string nouvellePhrase = new string(lettresNouvellePhrase);
      

      Et voilà. ;)

      Note au passage : la méthode qui se rapproche le plus de la méthode Replace que tu voulais est sans doute la méthode Select, qui permet d'écrire les lignes 9 à 13 de manière plus concise. Exemple :

      var changes = new Dictionary<char, char>();
      for(char c = 'a'; c < 'z'; c++)
          changes[c] = (char)(c+1);
      changes['z'] = 'a';
      
      string taPhrase = "coucou";
      
      char[] lettresNouvellePhrase = taPhrase.Select(lettre => changes[lettre]).ToArray();
      string nouvellePhrase = new string(lettresNouvellePhrase);
      

      • Partager sur Facebook
      • Partager sur Twitter
        25 mars 2012 à 13:59:11

        Tout d'abord merci beaucoup pour ton aide et le temps que tu à passer à me répondre. Je ne savais pas qu'il exister quelque chose comme les dictionnaire et je te remercie pour cet découverte car je débute en C# et c'est toujours un plaisir de découvrir de nouvelle chose.

        Avant d'aller plus loin je vais donc allez lire le cours qui parle des dictionnaire sur le site du zero, puis je continuerais en modifiant le code en prenant compte de se que tu m'a écrit. Ensuite je viendrais aux nouvelles dire si j'ai enfin réussi. :)

        Encore merci beaucoup ! :)
        • Partager sur Facebook
        • Partager sur Twitter

        [C#] replace et les tableau

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown