1
resposta

[Bug] Metodos do LinqOrder e LinqFilter Não estão funcionando

os metodos LinqOrder.ExibirListaDeArtistasOrdenados(musicas); e LinqFilter.FiltrarArtistasPorGeneroMusical(musicas, "Rock"); não estão funcionando quando tento testar, somente o metodo LinqFilter.FiltrarTodosOsGenerosMusicais(musicas); funciona.

Eu deixei somente o metodo LinqOrder.ExibirListaDeArtistasOrdenados(musicas); funcionando para testar por isso tem // no começo dos outros.

Program.cs:

using System.Text.Json;
using ScreenSound_04.Modelos;
using ScreenSound_04.Filtros;

using (HttpClient client = new HttpClient())
{
    try
    {
        string resposta = await client.GetStringAsync("https://guilhermeonrails.github.io/api-csharp-songs/songs.json");
        var musicas =JsonSerializer.Deserialize<List<Musica>>(resposta)!;
        //LinqFilter.FiltrarTodosOsGenerosMusicais(musicas);
        LinqOrder.ExibirListaDeArtistasOrdenados(musicas);
        //LinqFilter.FiltrarArtistasPorGeneroMusical(musicas, "Rock");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Temos um problema: {ex.Message}");
    }
}

Musica.cs:

using System.Text.Json.Serialization;

namespace ScreenSound_04.Modelos;

internal class Musica
{
    [JsonPropertyName("song")]
    public string? Nome { get; set; }
    public string? Artista { get; set; }
    [JsonPropertyName("duration_ms")]
    public int Duracao { get; set; }
    [JsonPropertyName("genre")]
    public string? Genero { get; set; }

    public void ExibirDetalhesDaMusica()
    {
        Console.WriteLine($"Nome: {Nome}");
        Console.WriteLine($"Artista: {Artista}");
        Console.WriteLine($"Duração: {Duracao /1000}");
        Console.WriteLine($"Gênero: {Genero}");
    }
}

LinqFilter.cs:

using ScreenSound_04.Modelos;

namespace ScreenSound_04.Filtros;

internal class LinqFilter
{
    public static void FiltrarTodosOsGenerosMusicais(List<Musica> musicas)
    {
        var TodosOsGenerosMusicais = musicas.Select(generos => generos.Genero).Distinct().ToList();
        foreach (var genero in TodosOsGenerosMusicais)
        {
            Console.WriteLine($"- {genero}");
        }
    }

    public static void FiltrarArtistasPorGeneroMusical(List<Musica> musicas, string genero)
    {
        var artistasPorGenero = musicas.Where(musicas => musicas.Genero!.Contains(genero)).Select(musica => musica.Artista).Distinct().ToList();
        Console.WriteLine($"Exibindo os  artistas por genero musical >>> {genero}");
        foreach (var artista in artistasPorGenero)
        {
            Console.WriteLine($"- {artista}");
        }
    }
}

LinqOrder.cs:

using ScreenSound_04.Modelos;

namespace ScreenSound_04.Filtros;

internal class LinqOrder
{
    public static void ExibirListaDeArtistasOrdenados(List<Musica> musicas)
    {
        var artistasOrdenados = musicas.OrderBy(musica => musica.Artista).Select(musica => musica.Artista).Distinct().ToList();
        Console.WriteLine("Lista de artistas ordenados");
        foreach (var artista in artistasOrdenados)
        {
            Console.WriteLine($"- {artista}");
        }
    }
}

Quando tento testar o metodo LinqOrder.ExibirListaDeArtistasOrdenados(musicas); aparece isso no console: Foto do que aparece

e quando tento o metodo LinqFilter.FiltrarArtistasPorGeneroMusical(musicas, "Rock"); aparece isso; Foto do que aparece

1 resposta

Olá, Raphael. Tudo bem?

Pelo que você descreveu, e pelos prints, ambos os métodos não estão retornando os resultados esperados.

  1. Verifique se a lista musicas está sendo corretamente preenchida: Após a deserialização, adicione um Console.WriteLine(musicas.Count); para garantir que a lista não está vazia.

  2. Verifique se os campos Artista e Genero não estão nulos: Pode ser que algumas entradas na sua lista tenham esses campos como null, o que pode afetar o OrderBy e o Contains. Você pode adicionar verificações para garantir que esses campos não sejam nulos antes de usá-los.

  3. Sensibilidade a maiúsculas e minúsculas: No método FiltrarArtistasPorGeneroMusical, o uso de Contains é sensível a maiúsculas e minúsculas. Verifique se o gênero passado como argumento está no mesmo formato que os dados.

  4. Log de depuração: Adicione alguns Console.WriteLine dentro dos métodos para verificar se as listas intermediárias estão sendo preenchidas corretamente. Por exemplo, dentro do ExibirListaDeArtistasOrdenados, você pode imprimir a lista antes e depois do OrderBy.

Aqui está um exemplo de como você pode modificar o método FiltrarArtistasPorGeneroMusical para lidar com possíveis valores nulos:

public static void FiltrarArtistasPorGeneroMusical(List<Musica> musicas, string genero)
{
    var artistasPorGenero = musicas
        .Where(musica => musica.Genero != null && musica.Genero.Contains(genero, StringComparison.OrdinalIgnoreCase))
        .Select(musica => musica.Artista)
        .Where(artista => artista != null)
        .Distinct()
        .ToList();

    Console.WriteLine($"Exibindo os artistas por gênero musical >>> {genero}");
    foreach (var artista in artistasPorGenero)
    {
        Console.WriteLine($"- {artista}");
    }
}

Espero que essas dicas ajudem a identificar o problema. Bons estudos.

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