none
Problema com Cast de Object para String[] RRS feed

  • Pergunta

  • Olá Pessoal,
    Este é meu Código.
    Contato refere-se a uma Classe.
                List<Contato> listacontato = new List<Contato>();
    
                                     
    
                Object[] ob = listacontato.ToArray();
    
                ArrayList al = ArrayList.Adapter(ob);
    
    
    
                string[] str = (string[])al.ToArray();
    Estou usando C#,Winforms.

    Estou querendo colocar o ArrayList dentro do string[], mas me retorna este erro.

    "Unable to cast object of type 'System.Object[]' to type 'System.String[]'."

    Espero ajuda, agradecido.

    Airton Barros
    JOAB
    domingo, 27 de dezembro de 2009 23:35

Respostas

  • João, realmente não é possível fazer esse conversão desta forma, para você passar sua lista de contatos para um array de string[] você terá de fazer uma iteração nos itens da sua coleção, desta forma:

    class Contato
    {
        private string toString = "Nome: {0} CPF: {1} RG: {2}";
        public string Nome;
        public string CPF;
        public string RG;
    
        public override string ToString()
        {
            return string.Format(toString, Nome, CPF, RG);
        }
    }

    //sua lista de contatos.
    List<Contato> listacontato = new List<Contato>();
    //criando alguns contatos            
    Contato tmp;
    for (int i = 0; i < 10; i++)
    {
        tmp = new Contato();
        tmp.Nome = i.ToString();
        tmp.CPF = i.ToString();
        tmp.RG = i.ToString();
        listacontato.Add(tmp);
    }
    
    //criando e inseriando no array de string
    string[] str = new string[listacontato.Count];
    for (int i = 0; i < listacontato.Count; i++)
        str[i] = listacontato[i].ToString();
    //o metodo ToString() ira chamar o ToString da Classe Contato
    espero ter ajudado, Abraço.
    • Sugerido como Resposta Rui SantosModerator segunda-feira, 28 de dezembro de 2009 13:19
    • Marcado como Resposta JOAB_ARAUJO segunda-feira, 28 de dezembro de 2009 15:41
    segunda-feira, 28 de dezembro de 2009 13:07
  • Ah eu so completei a resposta do Anselmo... mas marquei a dele como resposta pq so tava mostrando a quem vier a ler depois que tambem essa opção ^^


    Mas voltando ao seu problema... muda esse trecho

    //criando e inseriando no array de string
    string[] str = new string[listacontato.Count];
    for (int i = 0; i < listacontato.Count; i++)  str[i] = listacontato[i].ToString();


    para

    //criando e inseriando no array de string
    string[] str = new string[listacontato.Count];
    for (int i = 0; i < listacontato.Count; i++)  str[i] = listacontato[i].Nome;


    Só para mater os 2 exemplos... em Linq seria

    string[] str = listaContato.Select(item => item.Nome).ToArray();

    What would Brian Boitano do ? ((2B || !2B) is Question) ?
    • Marcado como Resposta JOAB_ARAUJO segunda-feira, 28 de dezembro de 2009 22:19
    segunda-feira, 28 de dezembro de 2009 16:08
    Moderador

Todas as Respostas

  • João, realmente não é possível fazer esse conversão desta forma, para você passar sua lista de contatos para um array de string[] você terá de fazer uma iteração nos itens da sua coleção, desta forma:

    class Contato
    {
        private string toString = "Nome: {0} CPF: {1} RG: {2}";
        public string Nome;
        public string CPF;
        public string RG;
    
        public override string ToString()
        {
            return string.Format(toString, Nome, CPF, RG);
        }
    }

    //sua lista de contatos.
    List<Contato> listacontato = new List<Contato>();
    //criando alguns contatos            
    Contato tmp;
    for (int i = 0; i < 10; i++)
    {
        tmp = new Contato();
        tmp.Nome = i.ToString();
        tmp.CPF = i.ToString();
        tmp.RG = i.ToString();
        listacontato.Add(tmp);
    }
    
    //criando e inseriando no array de string
    string[] str = new string[listacontato.Count];
    for (int i = 0; i < listacontato.Count; i++)
        str[i] = listacontato[i].ToString();
    //o metodo ToString() ira chamar o ToString da Classe Contato
    espero ter ajudado, Abraço.
    • Sugerido como Resposta Rui SantosModerator segunda-feira, 28 de dezembro de 2009 13:19
    • Marcado como Resposta JOAB_ARAUJO segunda-feira, 28 de dezembro de 2009 15:41
    segunda-feira, 28 de dezembro de 2009 13:07
  • Complementando o Anselmo... vc ainda pode usar o Linq para otimizar esse processo

    List<Contato> listaContato = new List<Contato>();
    string[] str = listaContato.Select(item => item.ToString()).ToArray();

    What would Brian Boitano do ? ((2B || !2B) is Question) ?
    segunda-feira, 28 de dezembro de 2009 13:18
    Moderador
  • Ok Anselmo.
    Vou implementdar sua resposta no meu código e retorno e marcarei como resposta.

    Agradecido.
    Sds.

    Airton Barros


    JOAB
    segunda-feira, 28 de dezembro de 2009 14:45
  • Olá Rui.

    Desculpa, meu VS é o 2005, não tenho Linq.


    Agradecido
    Sds.

    Airton Barros
    JOAB
    segunda-feira, 28 de dezembro de 2009 14:46
  • Olá Rui.

    Fiz os testes com um ListView e funcionou tudo ok.

    Mas, ele retorna o resultado assim:

    id: 1 Nome: João
    id: 2 Nome: Maria

    E eu queria que me retornasse apenas com o nome dos Contatos, tipo:

    João
    Maria
    etc...

    Agradecido.
    Airton Barros

    JOAB
    segunda-feira, 28 de dezembro de 2009 15:48
  • Ah eu so completei a resposta do Anselmo... mas marquei a dele como resposta pq so tava mostrando a quem vier a ler depois que tambem essa opção ^^


    Mas voltando ao seu problema... muda esse trecho

    //criando e inseriando no array de string
    string[] str = new string[listacontato.Count];
    for (int i = 0; i < listacontato.Count; i++)  str[i] = listacontato[i].ToString();


    para

    //criando e inseriando no array de string
    string[] str = new string[listacontato.Count];
    for (int i = 0; i < listacontato.Count; i++)  str[i] = listacontato[i].Nome;


    Só para mater os 2 exemplos... em Linq seria

    string[] str = listaContato.Select(item => item.Nome).ToArray();

    What would Brian Boitano do ? ((2B || !2B) is Question) ?
    • Marcado como Resposta JOAB_ARAUJO segunda-feira, 28 de dezembro de 2009 22:19
    segunda-feira, 28 de dezembro de 2009 16:08
    Moderador
  • Complementando a resposta do Rui só para você entender o que estava acontecendo, para ter aparecido o que você disse no seu listbview provavelmente na sua classe Contato você fez aquele override do método ToString() da seguinte forma:

     

    public override string ToString()

    {

        return string .Format(toString, Id, Nome);

    }

     

    Sendo assim quando ele vai adicionar o item no seu string[] esta sendo chamando esse metodo ToSTring(), então a linha fica com aquela string de Id:{0} e Nome:{1}

    Abraço.

    segunda-feira, 28 de dezembro de 2009 16:36
  • Olá Rui,

    Muito Agradecido.

    Airton Barros
    JOAB
    segunda-feira, 28 de dezembro de 2009 22:19
  • Olá Anselmo,

    Agradecido demais.

    Airton Barros
    JOAB
    segunda-feira, 28 de dezembro de 2009 22:20