none
C# - Concatenação em nome de variáveis com C#

    Pergunta

  • Ola pessoal.

    Como fazemos uma concatenação de strings em nome de variável em C#?

    // A aplicação tem estas variáveis
    bool k01_cell=false;
    bool k02_cell=false;
    bool k03_cell=false;
    bool k04_cell=false;
    bool k05_cell=false;
    bool k06_cell=false;
    
    bool k01_laser=false;
    bool k02_laser=false;
    bool k03_laser=false;
    bool k04_laser=false;
    bool k05_laser=false;
    bool k06_laser=false;
    
    // A aplicação recebe uma variável string chamada stringOut. Pega os 2 primeiros caracteres e armazena na string s_ID
    s_ID = stringOut.Trim().Substring(0, 2);
    
    // Tem 6 possíveis possibilidades 01 até 06
    
    if (s_ID.Contains("01") || s_ID.Contains("02") || s_ID.Contains("03") || s_ID.Contains("04") || s_ID.Contains("05") || s_ID.Contains("06"))
                {
                    // Se dentro da stringOut estiver as frases "replace the laser" ou "clean the cell".
                    if (stringOut.Contains("replace the laser") || stringOut.Contains("clean the cell"))
                    {
                        //Se na stringOut tiver "replace the laser".
                        if (stringOut.Contains("replace the laser"))
                        {
                           //Aqui a aplicação deve fazer com que a variável booleana mude para true.
    
                           //Como declaramos a variável booleana acima. Como concatenar aqui?
                           k+s_ID.ToString()+_laser = true;
                           //Se o s_ID for = "01" deve ficar assim: 
                           k01_laser=true;
                           //Tentei da forma abaixo, obviamente não funcionou.                       
    
                           //string vlaser = "k"+s_ID.ToString()+"_laser";// = true;
                           //vlaser.ToString()=true;
                        }
    
                        if (stringOut.Contains("clean the cell"))
                        {
                            //E aqui o mesmo acima.
                            k+s_ID.toString()+_cell = true;
                        
                        }
                    }
                    else
                    {
                       .........
                    }


    silvio pontes

    domingo, 29 de abril de 2012 22:19

Respostas

  • Ola Silvio,

    Ao inves de tentar criar o nome da variavel desta forma, pq vc não utiliza um dicionario? Um exemplo:

                bool k01_laser=false;
                bool k02_laser=false;
                bool k03_laser=false;
                bool k04_laser=false;
                bool k05_laser=false;
                bool k06_laser=false;
     
                Dictionary<stringbool> variaveisLaser = new Dictionary<stringbool>();
                variaveisLaser.Add("k01_laser"k01_laser);
                variaveisLaser.Add("k02_laser"k02_laser);
                variaveisLaser.Add("k03_laser"k03_laser);
                variaveisLaser.Add("k04_laser"k04_laser);
                variaveisLaser.Add("k05_laser"k05_laser);
                variaveisLaser.Add("k06_laser"k06_laser);
     
                // A aplicação recebe uma variável string chamada stringOut. Pega os 2 primeiros caracteres e armazena na string s_ID
                s_ID = stringOut.Trim().Substring(02);
     
                // Tem 6 possíveis possibilidades 01 até 06
     
                if (s_ID.Contains("01"|| s_ID.Contains("02"|| s_ID.Contains("03"|| s_ID.Contains("04"|| s_ID.Contains("05"|| s_ID.Contains("06"))
                {
                    // Se dentro da stringOut estiver as frases "replace the laser" ou "clean the cell".
                    if (stringOut.Contains("replace the laser"|| stringOut.Contains("clean the cell"))
                    {
                        //Se na stringOut tiver "replace the laser".
                        if (stringOut.Contains("replace the laser"))
                        {
                           ////Aqui a aplicação deve fazer com que a variável booleana mude para true.
                           ////Como declaramos a variável booleana acima. Como concatenar aqui?
                           //k+s_ID.ToString()+_laser = true;
                           ////Se o s_ID for = "01" deve ficar assim: 
                           //k01_laser=true;
                           ////Tentei da forma abaixo, obviamente não funcionou.                       
     
                           ////string vlaser = "k"+s_ID.ToString()+"_laser";// = true;
                           ////vlaser.ToString()=true;
     
                           variaveisLaser["k01_laser"= true;
     
                        }

    Vc criou um dicionario cuja chave é o nome da variavel (string) e o valor é a variável propriamente dita (bool). depois que vc fizer a concatenação do nome, basta buscar a variável no dicionário. Porem alguns cuidados:

    1. Se não me engano, o string.contains é case sensitive. Uma maneira melhor de comparar strings seria usar o String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase). Desta forma, vc garante que a comparacao é case insensitive

    2. Se isso estiver num metodo que é muito chamado, vc irá criar / "desalocar" vários dicionarios, o que pode virar um problema de desempenho

    3. Veja se vc não consegue mudar o desenho atual para não ter que receber a string stringOut e ter que ficar processando texto para definir fluxo. Isso pode dificultar a manutencao e causar erros quando vc precisar mudar a lógica do programa que podem levar um tempo maior para debugar / corrigir.

    Abracos, Daniel.

    • Sugerido como Resposta MiattoRocha segunda-feira, 30 de abril de 2012 00:41
    • Marcado como Resposta Silvio Pontes segunda-feira, 8 de outubro de 2012 02:01
    domingo, 29 de abril de 2012 23:07

Todas as Respostas

  • Ola Silvio,

    Ao inves de tentar criar o nome da variavel desta forma, pq vc não utiliza um dicionario? Um exemplo:

                bool k01_laser=false;
                bool k02_laser=false;
                bool k03_laser=false;
                bool k04_laser=false;
                bool k05_laser=false;
                bool k06_laser=false;
     
                Dictionary<stringbool> variaveisLaser = new Dictionary<stringbool>();
                variaveisLaser.Add("k01_laser"k01_laser);
                variaveisLaser.Add("k02_laser"k02_laser);
                variaveisLaser.Add("k03_laser"k03_laser);
                variaveisLaser.Add("k04_laser"k04_laser);
                variaveisLaser.Add("k05_laser"k05_laser);
                variaveisLaser.Add("k06_laser"k06_laser);
     
                // A aplicação recebe uma variável string chamada stringOut. Pega os 2 primeiros caracteres e armazena na string s_ID
                s_ID = stringOut.Trim().Substring(02);
     
                // Tem 6 possíveis possibilidades 01 até 06
     
                if (s_ID.Contains("01"|| s_ID.Contains("02"|| s_ID.Contains("03"|| s_ID.Contains("04"|| s_ID.Contains("05"|| s_ID.Contains("06"))
                {
                    // Se dentro da stringOut estiver as frases "replace the laser" ou "clean the cell".
                    if (stringOut.Contains("replace the laser"|| stringOut.Contains("clean the cell"))
                    {
                        //Se na stringOut tiver "replace the laser".
                        if (stringOut.Contains("replace the laser"))
                        {
                           ////Aqui a aplicação deve fazer com que a variável booleana mude para true.
                           ////Como declaramos a variável booleana acima. Como concatenar aqui?
                           //k+s_ID.ToString()+_laser = true;
                           ////Se o s_ID for = "01" deve ficar assim: 
                           //k01_laser=true;
                           ////Tentei da forma abaixo, obviamente não funcionou.                       
     
                           ////string vlaser = "k"+s_ID.ToString()+"_laser";// = true;
                           ////vlaser.ToString()=true;
     
                           variaveisLaser["k01_laser"= true;
     
                        }

    Vc criou um dicionario cuja chave é o nome da variavel (string) e o valor é a variável propriamente dita (bool). depois que vc fizer a concatenação do nome, basta buscar a variável no dicionário. Porem alguns cuidados:

    1. Se não me engano, o string.contains é case sensitive. Uma maneira melhor de comparar strings seria usar o String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase). Desta forma, vc garante que a comparacao é case insensitive

    2. Se isso estiver num metodo que é muito chamado, vc irá criar / "desalocar" vários dicionarios, o que pode virar um problema de desempenho

    3. Veja se vc não consegue mudar o desenho atual para não ter que receber a string stringOut e ter que ficar processando texto para definir fluxo. Isso pode dificultar a manutencao e causar erros quando vc precisar mudar a lógica do programa que podem levar um tempo maior para debugar / corrigir.

    Abracos, Daniel.

    • Sugerido como Resposta MiattoRocha segunda-feira, 30 de abril de 2012 00:41
    • Marcado como Resposta Silvio Pontes segunda-feira, 8 de outubro de 2012 02:01
    domingo, 29 de abril de 2012 23:07
  • Ao invés desse IF enorme que você verifica a variável s_ID, você pode usar o Switch Case.

    É uma boa prática que deixará o código mais organizado e de fácil leitura.

    segunda-feira, 30 de abril de 2012 00:43
  • Silvio,

    Uma sugestão também seria utilizar arrays ao invés de criar 12 variáveis.

    bool[] laser = new bool[6];
    bool[] cell = new bool[6];

    Com isso você poderia pegar o índice oriundo da string s_ID, transformar para inteiro e definir qual array seria modificado.

    int indexToChange;
    
    // recupera índice
    if (int.TryParse(s_ID, out indexToChange))
    {
        // verifica índice
        if (indexToChange > 0 && indexToChange < 7)
        {
            // compara strings
            if (stringOut.Contains("replace the laser"))
                laser[indexToChange - 1] = true;
            else if (stringOut.Contains("clean the cell"))
                cell[indexToChange - 1] = true;
        }
    }

    De qualquer forma, concordo com o Daniel, talvez seria mais interessante realizar o processamento de outra forma ao invés de trabalhar com texto.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    quarta-feira, 2 de maio de 2012 00:45
  • Ola Daniel e Miatto, muito boa a ajuda.

    Vou Testar como o Daniel sugeriu também.

    Agora estou testando o codigo abaixo.

    Miatto poderia explicar como usar Case?

    Mas se lembre disso: Tenho 6 dispositivos id01, id02, id03, id04, id05, id06.

    Todos podem dar as duas mensagens ao mesmo tempo. "replace the laser" e "clean the cell".

    Na verdade este código que estamos fazendo ainda é introdutório. Após esta fase de aprendizado, terei uma rotina que puxará o fluxo e checará os 6 devices para isolar os com problemas.

    	    bool k01_cell = false, k02_cell = false, k03_cell = false, k04_cell = false, k05_cell = false, k06_cell = false;
                bool k01_laser = false, k02_laser = false, k03_laser = false, k04_laser = false, k05_laser = false, k06_laser = false;
                string stringOut = "02,replace the laser";
                string s_ID = null;
    
                s_ID = stringOut.Trim().Substring(0,2);
    
                bool[] cells = { k01_cell, k02_cell, k03_cell, k04_cell, k05_cell, k06_cell };
                bool[] lasers = { k01_laser, k02_laser, k03_laser, k04_laser, k05_laser, k06_laser };
    
                if (s_ID=="01" || s_ID=="02" || s_ID=="03" || s_ID=="04" || s_ID=="05" || s_ID=="06")
    	        {
                    int index = int.Parse(s_ID) - 1;
                    
                    // Se stringOut conter "replace the laser" ou "clean the cell".
    		        if (stringOut.Contains("replace the laser") || stringOut.Contains("clean the cell"))
    		        {			        
    			        if (stringOut.Contains("replace the laser"))
    			        {
                           			lasers[index] = true;
    			        }
    			        else if (stringOut.Contains("clean the cell"))
    			        {
                            		cells[index] = true;
    			        }
    		        }
    	        }
    
                // Testando:
                for (int i = 0; i < lasers.Length; i++)
                {
                    System.Diagnostics.Debug.WriteLine("k0" + i + "_laser = " + lasers[i]);
                }


    silvio pontes








    quarta-feira, 2 de maio de 2012 01:08
  • Sim, concordo com vocês e já estou mudando a abordagem dos eventos! Foi muito boa a colocação do Daniel e do Miatto!

    Ari, de certa forma o seu código entrou no contexto da minha pergunta ao Miatto! Pessoal, preciso dizer algo agora. Tenho 6 aparelhos que estão conectados ao pc por um adaptador USB/Serial. Então envio o comando de leitura para cada device assim:

    id01 e espero a resposta, se não responder, reenvio o comando; após o id01 responder, envio id02, id03, id04, id05, id06, repetindo os passos de espero a resposta, se não responder, reenvio o comando,  para todos os 6 devices.

    Isso com intervalo de 6 segundos.  

    Se receber uma destas duas mensagens #1 "replace the laser" ou #2 "clean the cell"; a aplicação entra na rotina de manutenção e testa todos os devices.  Pode ser que só tenha mensagem #1 ou #2, mas também pode ser que tenha as duas mensagens, como também pode acontecer de todos darem as mensagens.

    Neste caso, como colocar os códigos que vocês me enviaram em um laço for(){} por exemplo e armazenar todos os ids com problemas e quais problemas? 

    Porque preciso dizer para o usuário qual ou quais os devices estão com problema e qual o problema.

    Ah, muito obrigado a todos vocês pela ajuda, ensinamentos e conselhos.

    Um grande abraço,


    silvio pontes









    • Editado Silvio Pontes quarta-feira, 2 de maio de 2012 03:23 gramatica
    quarta-feira, 2 de maio de 2012 03:09