none
Como filtrar uma coleção só com os dados que existem em outra coleção RRS feed

  • Pergunta

  • Olá,

    Como filtrar uma list para que permaneça só os dados que existem em outra list. Ou seja, se eu tiver uma list de datetimes e quiser filtrar só para aquelas datas que existem em outra list. Como filtro isso?

    segunda-feira, 19 de setembro de 2011 18:41

Respostas

  • Olá Gustavo,

    Caso vc esteja utilizando LINQ to Entities, vc pode fazer assim:

    pessoas.Where(p => (funcionarios.Where(f => f.Idade == p.Idade).Count() > 0))
    

    * Retorna as pessoas cuja idade também existe na lista de funcionários.

    Se estiver utilizando LINQ to Sql ou EF, utilize o Join, pois será mais performático.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    • Marcado como Resposta Gustavo Binnie quarta-feira, 21 de setembro de 2011 16:53
    quarta-feira, 21 de setembro de 2011 03:08
    Moderador

Todas as Respostas

  • Não sei se entendi muito bem, mais seria apenas para trazer as data aonde as mesma estiveram na outra lista e alterar a fonte original, pode utiliza join, veja este exemplo:

    List<string> cores = new List<string>()
    {
        "Verde",
        "Vermelho",
        "Rosa"
    };
    
    List<string> coresComparar = new List<string>()
    {
        "Verde",
        "Vermelho",
        "Amarelo",
        "Azul",
        "Roxo"
    };
    
    cores = (from c in cores
            join cj in coresComparar
            on c equals cj
            select c).ToList();
    

    No final só vai me retorna as cores Verde e Vermelho
     
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    segunda-feira, 19 de setembro de 2011 19:12
  • Vitor,

    A ideia é a seguinte: tenho duas listas de objetos com propriedades Data (tipo DateTime) e quero filtrar a lista 1 para guardar somente os objetos os quais a propriedade Data é igual a algum objeto da lista 2.

    segunda-feira, 19 de setembro de 2011 20:34
  • Então Gustavo para sua explicação nao veja outra maneira a naoser fazer o join neste duas listas e usa a propriedade Data para comparação:

    class MinhaClasse
    {
        public DateTime Data { get; set; }
    }
    

    List<MinhaClasse> lista1 = new List<MinhaClasse>()
    {
        new MinhaClasse(){ Data = Convert.ToDateTime("19/09/2011")},
        new MinhaClasse(){ Data = Convert.ToDateTime("18/09/2011")},
        new MinhaClasse(){ Data = Convert.ToDateTime("17/09/2011")},
        new MinhaClasse(){ Data = Convert.ToDateTime("16/09/2011")},
        new MinhaClasse(){ Data = Convert.ToDateTime("15/09/2011")}
    };
    
    List<MinhaClasse> lista2 = new List<MinhaClasse>()
    {
        new MinhaClasse(){ Data = Convert.ToDateTime("01/09/2011")},
        new MinhaClasse(){ Data = Convert.ToDateTime("02/09/2011")},
        new MinhaClasse(){ Data = Convert.ToDateTime("03/09/2011")},
        new MinhaClasse(){ Data = Convert.ToDateTime("16/09/2011")},
        new MinhaClasse(){ Data = Convert.ToDateTime("15/09/2011")}
    };
    
    var resultado = (from l1 in lista1
                    join l2 in lista2
                    on l1.Data equals l2.Data
                    select l1).ToList();
    


    No código acima, teramos apenas as datas 16/05/2011 e 15/06/2011 pois elas existem na lista 1 e 2
     
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    segunda-feira, 19 de setembro de 2011 21:10
  • Vitor,

    E se a lista 1 tiver objetos do tipo A e a lista 2 tiver objetos do tipo B. Ambos os tipos, A e B, contém uma propriedade do tipo DateTime, mas o restante de suas propriedades são distintas. Dessa forma, não sei se fazer um join seria melhor solução. Afinal quero manter os objetos do tipo A na lista 1 que tem propriedades DateTime que existam na propriedade do tipo B da lista 2.

    terça-feira, 20 de setembro de 2011 00:13
  • Olá Gustavo,

    Caso vc esteja utilizando LINQ to Entities, vc pode fazer assim:

    pessoas.Where(p => (funcionarios.Where(f => f.Idade == p.Idade).Count() > 0))
    

    * Retorna as pessoas cuja idade também existe na lista de funcionários.

    Se estiver utilizando LINQ to Sql ou EF, utilize o Join, pois será mais performático.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    • Marcado como Resposta Gustavo Binnie quarta-feira, 21 de setembro de 2011 16:53
    quarta-feira, 21 de setembro de 2011 03:08
    Moderador