Olá! No console repetem nomes de alguns artistas, como excluí-los ?
Olá! No console repetem nomes de alguns artistas, como excluí-los ?
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
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!