6
respostas

[Dúvida] Repetição de nomes no console

Olá! No console repetem nomes de alguns artistas, como excluí-los ?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

6 respostas

Olá, Rubens. Tudo bem?

Eu não sei como está o seu cpodigo, mas vou deixar uma dica para resolver esse problema de repetição de nomes no console, você pode utilizar o método Distinct() do LINQ para remover duplicatas da lista de artistas antes de exibi-los. Aqui está um exemplo de como você pode fazer isso:

using System.Linq;

// Supondo que 'artistas' seja a lista de artistas que você está exibindo
var artistasUnicos = artistas.Distinct().ToList();

foreach (var artista in artistasUnicos)
{
    Console.WriteLine($"Artista: Id: {artista.Id}");
    Console.WriteLine($"Nome: {artista.Nome}");
    Console.WriteLine($"Foto de Perfil: {artista.FotoPerfil}");
    Console.WriteLine($"Bio: {artista.Bio}");
    Console.WriteLine("*******************************************************");
}

Garanta que a classe Artista implementa IEquatable<Artista> ou sobrescreva os métodos Equals e GetHashCode para que o Distinct() funcione corretamente.

Espero ter ajudado. Qualquer coisa compartilha o seu código. Bons estudos

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Olá! Desculpe em demorar a responder amigo. Não entendi sobre : "Garanta que a classe..." Utilizei essa solução dentro da classe 'MenuMostrarArtista' , e continuou o mesmo.

Grato!

Olá, Rubens.

Sobre sua última dúvida, o Distinct() pode não estar funcionando porque, por padrão, ele compara objetos pela referência na memória, e não pelo valor das propriedades. Para que ele funcione corretamente, você precisa sobrescrever os métodos Equals e GetHashCode na classe Artista.

Ajuste sua classe assim:


using System;
using System.Collections.Generic;

public class Artista : IEquatable<Artista>
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public string FotoPerfil { get; set; }
    public string Bio { get; set; }

    public bool Equals(Artista other)
    {
        if (other == null) return false;
        return this.Nome == other.Nome; // Compara os artistas pelo nome
    }

    public override int GetHashCode()
    {
        return Nome.GetHashCode();
    }
}

Agora, ao chamar Distinct(), os objetos serão comparados corretamente e os nomes duplicados serão removidos.

Se ainda houver problemas, tente compartilhar o código onde está chamando Distinct() para analisarmos melhor.

Fico à disposição. Abraços e bons estudos.

Oi, Renan! Ainda continua com o mesmo nomes repetidos. Minha classe Artista:

namespace ScreenSound.Modelos; 

public class Artista : IEquatable<Artista>
{
    public string Nome { get; set; }
    public string FotoPerfil { get; set; }
    public string Bio { get; set; }
    public int Id { get; set; }

    public bool Equals(Artista other)
    {
        if (other == null) return false;
        return this.Nome == other.Nome; // Compara os artistas pelo nome
    }

    public override int GetHashCode()
    {
        return Nome.GetHashCode();
    }


    public virtual ICollection<Musica> Musicas { get; set; } = new List<Musica>();
    
    public Artista(string nome, string bio)
    {
        Nome = nome;
        Bio = bio;
        FotoPerfil = "https://cdn.pixabay.com/photo/2016/08/08/09/17/avatar-1577909_1280.png";
    }

     public void AdicionarMusica(Musica musica)
    {
        Musicas.Add(musica);
    }

    public void ExibirDiscografia()
    {
        Console.WriteLine($"Discografia do artista {Nome}");
        foreach (var musica in Musicas)
        {
            Console.WriteLine($"Música: {musica.Nome} - Ano de lançamento: {musica.AnoLancamento}");
        }
    }

    public override string ToString()
    {
        return $@"Id: {Id}
            Nome: {Nome}
            Foto de Perfil: {FotoPerfil}
            Bio: {Bio}";
    }

    internal static object Distinct()
    {
        throw new NotImplementedException();
    }
}

Olá, Rubens.

Sobre sua última dúvida, o problema pode estar no método GetHashCode(). Quando você utiliza Nome.GetHashCode(), pode haver colisões (dois nomes diferentes gerando o mesmo código). Para garantir que Distinct() funcione corretamente, altere GetHashCode() para incluir mais propriedades na comparação.

Ajuste sua classe assim:


public override int GetHashCode()
{
    return HashCode.Combine(Nome, Id);
}

Isso tornará a comparação mais confiável, evitando repetições inesperadas.

Se os nomes ainda estiverem duplicados, verifique se a lista de artistas contém instâncias repetidas antes da chamada de Distinct(). Você pode depurar imprimindo os IDs antes da filtragem para ver se são realmente duplicatas no banco de dados ou apenas na exibição.

Compara com o código da aula e veja se tem alguma diferença. Qualquer coisa compartilha o seu projeto completo aqui com a gente. Sobe ele no GitHub.

Fico à disposição. Abraços e bons estudos!

Olá Renan !

Ok, tô enviando o link do projeto antes de modificar as suas últimas recomendações. Já deveria ter compartilhado.

https://github.com/Rubferreira/ScreenSound---.NET-persistindo-dados-

Obrigado!