C# List

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.
 
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.
 
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.
 
Código:
List<ClientObj> original;
List<ClientObj> copia = new List<ClientObj>();
foreach (ClientObj c in original) copia.Add(c.Clone());
return copia;
 
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...
 
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:
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:
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().
 
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;
        }
?
 
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.
 
Sim... é isso :004:
Mas depois... tenho de escrever como escrevi... como fizeste, dá erro.
MAs o modo como escrevi é, parece-me o mesmo.
 
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());
        }
    }
 
Back
Topo