none
Verificar item em comum dentre várias listas RRS feed

  • Pergunta

  • Bom dia.

    Preciso de um método que verifica se dentre os objetos de várias listas, existe algum que é comum em todas.

    Exemplo:

    Lista A

    - obj1

    - obj2

    - obj3

    Lista B

    - obj1

    - obj5

    - obj7

    Lista C

    - obj1

    - obj4

    - obj6

    Preciso identificar se existe algum obj em comum entre essas listas.

    Se existir, preciso obter as informações desse objeto.

    Nesse caso existe, é o obj1.

    Valew, abraços.


    quinta-feira, 3 de dezembro de 2015 10:42

Respostas

  • Olá Ferboni,

    Você poderia sobrescrever o método Equals do seu objeto. Mais ou menos assim:

    public class NomeDaClasse {
        //...
        public override bool Equals(object obj)
        {
            if (obj == null || obj.GetType() != typeof(NomeDaClasse))
            return false;
     
            NomeDaClasse p = (NomeDaClasse)obj;
            return (this.Atributo == p.Atributo);
        }
    }

    Lembrando que onde o código compara os dois atributos, você deveria usar os seus critérios de comparação, ok?

    Você também pode utilizar o Intersect, que vai pegar apenas o objeto em comum das suas listas, e criar uma terceira lista. Você pode ler mais sobre ele aqui.

    Espero ter ajudado!

    • Marcado como Resposta Marcos SJ quinta-feira, 3 de dezembro de 2015 18:53
    quinta-feira, 3 de dezembro de 2015 11:05

Todas as Respostas

  • Olá Ferboni,

    Você poderia sobrescrever o método Equals do seu objeto. Mais ou menos assim:

    public class NomeDaClasse {
        //...
        public override bool Equals(object obj)
        {
            if (obj == null || obj.GetType() != typeof(NomeDaClasse))
            return false;
     
            NomeDaClasse p = (NomeDaClasse)obj;
            return (this.Atributo == p.Atributo);
        }
    }

    Lembrando que onde o código compara os dois atributos, você deveria usar os seus critérios de comparação, ok?

    Você também pode utilizar o Intersect, que vai pegar apenas o objeto em comum das suas listas, e criar uma terceira lista. Você pode ler mais sobre ele aqui.

    Espero ter ajudado!

    • Marcado como Resposta Marcos SJ quinta-feira, 3 de dezembro de 2015 18:53
    quinta-feira, 3 de dezembro de 2015 11:05
  • Boa tarde.

    Com LINQ essa tarefa fica bastante simples:

    List<NomeDaClasse> lstRepetidos = lstObjetos1.Where(x => lstObjetos2.Any(y => y == x) && lstObjetos3.Any(y => y == x)).ToList();
    Assim tu terás uma lista com todos objetos que se repetem nas 3 listas.

    Att., Rafael Simor

    quinta-feira, 3 de dezembro de 2015 18:54
  • Essas listas são retornadas de uma query com linq.

    O problema é que eu não sei quantas listas vão vir.

    quinta-feira, 3 de dezembro de 2015 20:42
  • Então tu terias uma lista com listas de um objeto?

    Att., Rafael Simor

    quinta-feira, 3 de dezembro de 2015 20:52
  • Exato.

    Eu tenho uma lista de objetos que contem todos os objetos de todas as listas.

    Tenho que comparar cada objeto dessa lista de objetos de todas as listas com cada objeto de cada lista, afim de encontrar um que seja comum em todas  as listas.

    quinta-feira, 3 de dezembro de 2015 21:01
  • Bom, tu podes fazer o seguinte (pseudo-código):

    List<NomeDaClasse> lstRepetidos = lstListas[0];
    
    for (int i = 0; i < lstListas.Count()-1; i++)
    {
        lstRepetidos = lstListas[i].Where(x => lstListas[i+1].Any(y => y == x)).ToList();
    }

    Onde o "lstListas" seria tua lista de listas. Ao final do for terás somente os itens que se repetem em todas listas.


    Att., Rafael Simor

    quinta-feira, 3 de dezembro de 2015 21:23