1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C# List

Discussão em 'Programação' iniciada por Machacaz, 9 de Dezembro de 2008. (Respostas: 15; Visualizações: 2481)

  1. Machacaz

    Machacaz Power Member

    Saudações.
    Em java:

    Vector<ClienteInfo> clients = new Vector<ClienteInfo>();

    for (int i=0; i<clients.size(); i++) {
    ClienteInfo tmp = clients.get(i);
    }

    Alguém sabe como fazer o mesmo em C#, ou seja, retirar um objecto de uma list, atribuíndo-o a uma varíavel do mesmo tipo do objecto??

    List <infoClient> clientLst = new List <infoClient>();

    for (int i = 0; i < clientLst.Count; i++) {
    infoClient tmp = clientLst.????
    //tmp.client;

    }

    Estou a anhar com isto... se alguém souber, agradecia.
     
  2. AliFromCairo

    AliFromCairo Power Member

    Código:
    infoClient tmp = clientLst[i];
     
  3. The_True_Eue

    The_True_Eue Power Member

  4. Machacaz

    Machacaz Power Member

    Saudações.
    Tenho procurado na internet mas as soluções que encontrei não me têm funcionado.
    Basicamente, tenho uma lista de utilizadores e queria fazer um clone desta... basicamente:

    Tenho:
    Código:
    List<ClientObj> users = new List<ClientObj>();
    e queria ter uma nova lista de clientobj que fosse a cópia do conteúdo desta!

    Como faço isso? Pensei inicialmente em fazer com users. users.Copy(newlist) mas não dá, obviamente.
     
  5. bandalho_zune

    bandalho_zune I'm cool cuz I Fold

    Se entendi, precisas de um método que te devolva uma cópia do teu objecto Utilizadores, normalmente isso encontra-se na sua própria classe.
     
  6. Baderous

    Baderous Banido

    Código:
    List<ClientObj> original;
    List<ClientObj> copia = new List<ClientObj>();
    foreach (ClientObj c in original) copia.Add(c.Clone());
    return copia;
     
  7. Tomb4000

    Tomb4000 Power Member

    ainda não percebi muito bem o que pretendes, mas se realmente tens uma lista, e queres copia-la, embora depois fiques com instancias que não representam os mesmos objectos, o que o Baderous mensionou funciona bem (falta so o cast do object para a tua classe),

    se: tens uma lista e queres criar outra lista que represente as mesmas instancias já é outra coisa...
     
  8. Machacaz

    Machacaz Power Member

    Saudações.
    Eu tenho uma lista users e quero criar uma lista userLst que seja uma cópia da users

    E queria criar uma segunda lista que fosse a cópia desta primeira lista.


    Não sei se é possível mas o que fiz foi:

    Código:
    List<ClientObj> users = new List<ClientObj>();
    List<ClientObj> userLst = new List<ClientObj>();
    
    userLst = users;
     
    Última edição: 2 de Janeiro de 2009
  9. Baderous

    Baderous Banido

    Não, isso apenas indica que userLst passa a referenciar a lista users.
     
  10. IComeFromBehind

    IComeFromBehind Power Member

    Em alternativa à solução do Baderous podes usar o método AddRange.
     
  11. Machacaz

    Machacaz Power Member

    Vou usar a do Baderous, então.
    E muito obrigado pela rápida resposta!


    P.S.:

    Error 1 'RemoteObject.ClientObj' does not contain a definition for 'Clone' and no extension method 'Clone' accepting a first argument of type 'RemoteObject.ClientObj' could be found (are you missing a using directive or an assembly reference?)


    qual será a referência?

    E assim, fazendo uso do código do Baderous:

    foreach (ClientObj c in users) userLst.Add(c);

    Está correcto?
     
    Última edição: 3 de Janeiro de 2009
  12. Baderous

    Baderous Banido

    Esse código que colocaste faz uma shallow copy, ou seja, os objectos ficam partilhados entre a lista original e a lista cópia.
    Não estou muito a par de C# mas googla por "deep clone" e és capaz de chegar a algum lado. Pelos vistos tens de implementar uma método Clone() para a tua classe. Em Java seria:
    Código:
    public ClientObj clone() {
    return new ClientObj(this);}
    Ou seja, crio uma nova instância de ClientObj chamando o construtor de cópia sobre o objecto que recebeu a mensagem clone().
     
  13. Machacaz

    Machacaz Power Member

    Pois... não que seja grande programador, não sou :005:
    Mas C# também é novidade para mim ...

    Ainda assim... a "conversão" do teu código para c# será algo como isto

    Código:
    public ClientObj clone(){
                return this;
            }
    ?
     
  14. Baderous

    Baderous Banido

    Imaginando que essa tua classe ClientObj tem a seguinte variável de instância definida:
    Código:
    public class ClientObj {
    private String nome;
    ...
    }
    E que definiste um método selector (aka: get) para lhe acederes:
    Código:
    public String getNome() { return this.nome; }
    E que também definiste um construtor que recebe como parâmetro uma instância de ClientObj copiando os seus atributos:
    Código:
    public ClientObj(ClientObj c) {
    this.nome = c.getNome();
    }
    Então o clone pode ser definido pelo tal código que indiquei acima.
     
  15. Machacaz

    Machacaz Power Member

    Sim... é isso :004:
    Mas depois... tenho de escrever como escrevi... como fizeste, dá erro.
    MAs o modo como escrevi é, parece-me o mesmo.
     
  16. Baderous

    Baderous Banido

    ClientObj.cs:

    Código:
        class ClientObj
        {
            private String nome;
    
            public String getNome() { return this.nome; }
    
            public ClientObj(String nome) { this.nome = nome; }
    
            public ClientObj(ClientObj c)
            {
                this.nome = c.getNome();
            }
    
            public void setNome(String n) { this.nome = n; }
    
            public ClientObj clone() { return new ClientObj(this); }
        }
    }
    Program.cs:

    Código:
    class Program
        {
            static void Main(string[] args)
            {
                ClientObj c1 = new ClientObj("joao");
                ClientObj c2 = c1.clone();
                c2.setNome("pedro");
                Console.Write(c1.getNome());
                Console.Write(c2.getNome());
            }
        }
     

Partilhar esta Página