none
Procurar item de um List<> em outro List<> mesma Classe RRS feed

  • Pergunta

  • Fala Galera

    Tenho uma classe de eventos com vários campos

    E dois List<Eventos> eventos e List<Eventos> eventos2 por exemplos.

    Cada um preencher um gridview sendo que um é de entrada de dados ou seja quando o cara clicar em salvar os dados digitados estaram em memoria.

    Antes de concluir a tarefa precido verificar se o cod evento de um list consta no outro para editar o campo Status 

    Pensei em fazer dois foreach e compara os campos

    Existe uma maneira melhor de se fazer isso??

    Abraço

    sábado, 22 de agosto de 2015 18:21

Todas as Respostas

  • você pode utilizar o contains do list

    foreach (Eventos evento in eventos)
    {
         if (eventos2.Contains(evento))
         }
            //TO DO
         }
    }                


    Natan

    sábado, 22 de agosto de 2015 21:43
  • Preciso comparar o id das duas se igual atualizou uma q esta em tempo de execução

    domingo, 23 de agosto de 2015 22:17
  • foreach (var e1 in eventos)
    {
       if (eventos2.Find(x => x.Codigo == e1.Codigo) != null)
       {
         // Faz o que precisa, o evento
       }
    }

    Se Find for null não tem o evento e1 na list evento2, se não for null tem.


    "Codigo" é o nome do atributo para sua ID, podedia ser x.ID e e1.ID...

    No caso acima supus isso:

    class Evento()
    {
       private Codigo{ get; set; }
       //outros atributos...
    }

    • Editado Marcos Gerene segunda-feira, 24 de agosto de 2015 00:10
    segunda-feira, 24 de agosto de 2015 00:07
  • Se você quiser verificar a existência de um evento "T" em sua lista de eventos "List<T>", você pode utilizar o método Except de "List<T>".

    Ele produz a diferença de dois "List<T>" utilizando o comparador padrão EqualityComparer<T>.Default

    var resultado = evento2.Except(evento);

    Como no seu caso é necessário fazer a comparação especificando valores, como por exemplo a propriedade Id de sua classe Evento, você pode utilizar a interface IEqualityComparer<T> e criar seu próprio comparador.

    Por exemplo, para criar um comparador de Evento utilizando a propriedade Id de sua classe:

    Evento:

    public class Evento
    {
        public int Id { get; set; }
        public string Nome { get; set; }
    }

    Comparador:

    class EventoComparer : IEqualityComparer<Evento>
    {
        public bool Equals(Evento e1, Evento e2)
        {
            return e1.Id == e2.Id; // <- faz a comparação utilizando sua lógica e retorna um valor verdadeiro ou falso
        }
    
        public int GetHashCode(Evento evt)
        {
            if (evt == null) return 0;
    
            int hash = 101;
            hash = (hash * 701) ^ evt.Id.GetHashCode(); // <- faz o cálculo de sua lógica de hash
            return hash;
        }
    }

    Utilização:

    var result = evento2.Except(evento, new EventoComparer());

    Na classe EventoComparer você tem dois métodos, Equals e GetHashCode.

    O primeiro método é utilizado para fazer a comparação utilizando sua própria lógica.

    O segundo método calcula um HashCode. Se o HashCode dos dois items não forem iguais eles não serão considerados iguais e o método Equals nunca será chamado.

    Se você compara mais de uma propriedade é interessante que você combine elas como no código de exemplo:

    public int GetHashCode(Evento evt)
        {
            if (evt == null) return 0;
    
            int hash = 101;
            hash = (hash * 701) ^ evt.Id.GetHashCode(); 
            hash = (hash * 701) ^ evt.Nome.GetHashCode(); 
            return hash;
        }


    ROBERTOSLJUNIOR

    • Sugerido como Resposta robertosljunior segunda-feira, 24 de agosto de 2015 01:20
    • Não Sugerido como Resposta robertosljunior quinta-feira, 27 de agosto de 2015 02:59
    • Sugerido como Resposta robertosljunior quinta-feira, 27 de agosto de 2015 02:59
    segunda-feira, 24 de agosto de 2015 00:56
  • isso ai quando disse Id seria o código assim como VC ilustrou

    Vou testar a ideia de vcs e dou um feedback

    segunda-feira, 24 de agosto de 2015 01:00
  • Conseguiu solucionar seu problema?

    ROBERTOSLJUNIOR

    domingo, 6 de setembro de 2015 05:01