CLONANDO E COMPARANDO LIST<T>

PERCIFILHO 28/04/2016 10:23:45
#461570
Bom dia pessoal, mais uma vez estou aqui com dúvidas em relação a List<T>.
O que eu precisava agora é saber qual a melhor maneira de se fazer isso:
Eu preencho um DataGridView com uma List<T> de contatos onde traz todos os registros, menos o usuário, dessa maneira:

lista_contatos = new Contato().GetAll();
lista_contatos = lista_contatos.Where(x => x.Nome != _user).OrderBy(x => x.Nome).ToList();
dgvContatos.DataSource = lista_contatos;


Agora eu precisava colocar em um Timer uma rotina para verificar em um intervalo de tempo, se existem contatos novos ou se algum foi excluído.
Então pensei em fazer assim: quando preencher o DataGridView, fazer uma cópia (clone) da lista contatos, chamada lista_compara_contatos;
Aí quando executar o Timer, ele cria uma nova lista contatos e compara com a lista compara contatos;
Se as duas forem idênticas, não faz nada, apenas se não forem idênticas é que vai dar um refresh no DataGridView;
Isso porque se toda vez que o Timer executar, o DataGridView vai ficar dando refresh, e fica um efeito muito desagradável, ele parece que fica [Ô]piscando[Ô].
Como faço para fazer um clone da lista contatos e como faço para compará-la?
Encontrei alguns exemplos na internet mas nenhum está funcionando.
DS2T 28/04/2016 10:40:30
#461574
Resposta escolhida
Antes de te dar a solução do que você realmente quer, queria entender uma coisa: Você não vai adicionar os contatos pelo seu sistema? Se sim, não seria mais fácil simplesmente disparar a rotina de atualizar o grid logo após adicionar o contato? Você tem algum motivo especial para usar o timer?
PERCIFILHO 28/04/2016 12:11:32
#461586
é que funciona assim:
Ao abrir o form, o grid dos contatos é preenchido. Acontece que se algum usuário se cadastrar, tem que aparecer pra mim automaticamente, sem eu precisar clicar em algum botão, por exemplo para dar um refresh no grid, entendeu? Por isso que eu disse de colocar em um Timer. Aí ele faz a verificação a cada x segundos e se tiver alteração n a List<T> ele dá o refresh, senão não faz nada.
DS2T 28/04/2016 12:47:17
#461589
Entendi.
A primeira vista, usar um Timer ou uma Thread parece ser a solução mais simples mesmo. Só que é bom salientar que o mais simples (de implementação) vai ser custoso para seu sistema. Ficar consumindo processamento direto.
Nesse caso, eu usaria uma comunicação interna via Socket pra isso. Assim quando eu acabasse de adicionar, enviaria uma mensagem comunicando para o outro usuário que foi adicionado um contato e assim eu atualizaria o grid.

Enfim...

Para clonar:

List<Mensagem> clone = mensagens.ToList();


Para verificar se é a mesma lista:

            if (Enumerable.SequenceEqual(mensagens, clone))
{

}
KERPLUNK 28/04/2016 13:18:50
#461598
O que você quer é uma sincronia entre os dados locais(os visualizados) e o server(o banco de dados), certo? Se for, tenho boas e más notícias pra você...
JABA 28/04/2016 13:32:17
#461602
Isso não seria um caso para tratamento de concorrência de dados?

Veja esses links:

http://www.macoratti.net/vbn5_icd.htm
http://www.macoratti.net/13/05/adn_vvc1.htm
http://www.macoratti.net/07/10/vbn5_tcd.htm
http://www.macoratti.net/adn_ccd1.htm
PERCIFILHO 28/04/2016 13:58:07
#461608
Lá vem o Kerplunk me desanimar de novo!!!!!
Primeiro conta as más notícias que é pra me deixar prá baixo.
Depois conta as boas (se é que existe mesmo) que aí eu me alegro um pouquinho. rsrs
KERPLUNK 28/04/2016 14:53:28
#461611
A má notícia é que se você quer fazer isso da maneira correta, vai dar um pouco de trabalho.
A boa notícia é que tem solução.

Você pode simplesmente fazer o que você quer, colocar um timer ou thread que atualize os dados à cada x intervalo de tempo, mas isso vai consumir recursos desnecessariamente. A maneira mais correta para se fazer isso seria com uma WebAPI, com notificações PUSH e por isso que daria um pouco de trabalho, pois você teria que mudar bastante coisa no seu sistema. Com isso, você estaria investindo em algo que será de grande valia para seus sistemas. WebAPI, vai ser útil quando você quiser migrar tudo para um ambiente web. Uma alternativa para fazer isso, é o uso de uma técnica que chamo de [Ô]beacon[Ô]. Consiste em um programa server(seja por winsock, ou http) que notifica clients quando da atualização de dados. Ele dispara uma mensagem para os clients que fizeram possuem os dados atualizados e com isso se faz o update. é mais ou menos como um [Ô]chat de dados[Ô]. Mas é também trabalhoso de ser implementado e a implementação de WebAPI além de menos trabalhosa, é mais vantajosa, visto a gama de possibilidades que ela proporciona comparado com uma aplicação tão específica quanto a que descrevi.
PERCIFILHO 28/04/2016 15:08:26
#461613
Vou ter que me aprofundar melhor neste lance de WebApi, pois até hoje só consegui programar alguma coisa pra Desktop.
Não sei se conseguirei muito progresso, visto que a [Ô]idade[Ô] já chegou e ando meio desanimado com as coisas que acontecem no nosso país, na sociedade em geral e isso está se refletindo um pouco em mim, me deixando meio triste e desanimado.
Mas prometo que vou tentar. E com certeza surgirão várias novas dúvidas e que vocês meus amigos do VBMania vão ter que ter muita paciência comigo se quiserem me ajudar.
Abraços a todos.
KERPLUNK 28/04/2016 15:13:55
#461614
Paciência não é problema! Poste suas dúvidas à vontade. Se souber, respondo. Se necessário, faço exemplos, como já fiz várias vezes para várias pessoas aqui mesmo no fórum e em outros.
PERCIFILHO 28/04/2016 15:29:33
#461616
Valeu, Kerplunk, realmente você já me ajudou e muito. Vou ter que começar revendo os teus vídeos sobre WebApi.
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas