C# – Como contar itens duplicados em listas genéricas.

É muito comum você precisar encontrar os itens distintos de uma lista genérica e é uma coisa muito fácil de fazer usando o Linq, precisei fazer algo parecido um dia desses em um projeto, vou deixar como dica, nunca se sabe quando iremos precisar.

No meu caso precisava saber se existiam objetos com propriedades iguais na minha coleção para efetuar uma validação, é mais ou menos o cenário abaixo.

Primeiro vamos criar uma classe chamada Pessoa bem simples:

public class Pessoa
{
        public Pessoa(int id, string nome, string sobrenome)
	{
		this.Id = id;
		this.Nome = nome;
		this.SobreNome = sobrenome;
	}
	public int Id { get; set; }
	public string Nome { get; set; }
	public string SobreNome { get; set; }
}

Depois vamos criar uma lista com algumas “Pessoas” e listar em tela três valores:

  • a quantidade de itens duplicados com mesmo id, nome e sobrenome;
  • a quantidade de itens duplicados com mesmo nome e sobrenome;
  • a quantidade de itens duplicados somente com o mesmo sobrenome.
  • class Program
    {
    static void Main(string[] args)
    {
    	List<Pessoa> pessoas = new List<Pessoa>();
    	pessoas.Add(new Pessoa(1,"Jose","Silva"));
    	pessoas.Add(new Pessoa(2,"Maria","Gomes"));
    	pessoas.Add(new Pessoa(1,"Jose","Silva"));
    	pessoas.Add(new Pessoa(3,"Roberto","Justus"));
    	pessoas.Add(new Pessoa(4,"Alice","Silva"));
    	pessoas.Add(new Pessoa(1,"Jose","Silva"));
    
    	int itens_duplicados = pessoas
    		.GroupBy(p => new { p.Id, p.Nome, p.SobreNome })
    		.Where(x => x.Count() > 1)
    		.Sum(x => x.Count());
    
    	int itens_duplicados_por_nome_e_sobrenome = pessoas
    		.GroupBy(p => new { p.Nome, p.SobreNome })
    		.Where(x => x.Count() > 1)
    		.Sum(x => x.Count());
    			
    	int itens_duplicados_por_sobrenome = pessoas
    		.GroupBy(p => new { p.SobreNome })
    		.Where(x => x.Count() > 1)
    		.Sum(x => x.Count());
    
    	Console.WriteLine("Itens duplicados: " + itens_duplicados);
    	Console.WriteLine("Itens com mesmo nome e sobrenome: " + itens_duplicados_por_nome_e_sobrenome);
    	Console.WriteLine("Itens com mesmo sobrenome: " + itens_duplicados_por_sobrenome);
    	Console.ReadLine();
    }
    }
    

    itensDuplicados

    É isso ae se gostou ou ajudou comenta para incentivar!!
    Um abraço.

7 comments

  1. Olá meu Amigo, tudo bem? Poderia me ajudar numa dúvida. Tentei aplicar o seu exemplo, para uma realidade que estou enfrentando aqui no trampo. Eu tenho um json, onde os meus ID’s de produtos são os SKU’s que nunca se repetem, porém eles repetem o modelID. Quero eliminar os modelID repetidos, retornando somente os SKU’s sem repetí-los.

    Segue um trecho do json:

    {
    “status”: 200,
    “retorno”: {
    “mensagem”: “Conclu�do com sucesso.”,
    “dados”: {
    “dadosConsulta”: {
    “cpfConsulta”: “01269869167”
    },
    “informacoesIndividual”: [
    {
    “documento”: “01269869167”,
    “modelID”: “8786292”,
    “itemColorID”: “AZUL_MARIN”,
    “propensity”: 1,
    “sku”: “8786293”,
    “dataInclusao”: “2018-04-26 00:00:00”,
    “dataAtualizacao”: “2018-04-26 00:00:00”
    },
    {
    “documento”: “01269869167”,
    “modelID”: “8786292”,
    “itemColorID”: “AZUL_MARIN”,
    “propensity”: 1,
    “sku”: “8786294”,
    “dataInclusao”: “2018-04-26 00:00:00”,
    “dataAtualizacao”: “2018-04-26 00:00:00”
    },
    Observe que o ModelD repete várias vezes. Quero pegar somente 1, distinguindo-os. Entendeu?

  2. Olá,
    legal… parabéns pela iniciativa me ajudou muito.
    Só um comentário, precisei colocar using System.Linq; para reconhecer os métodos.

Leave a Reply

O seu endereço de e-mail não será publicado.