Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

0
respostas

[Projeto] Faça como eu fiz: mais uma classe

Classe Program:

using ScreenSound_API.Filtros;
using ScreenSound_API.Modelo;
using System.Text.Json;

using (HttpClient cliente = new())
{
    var resposta = await cliente.GetStringAsync("https://guilhermeonrails.github.io/api-csharp-songs/songs.json");

    List<Musica> musicas = JsonSerializer.Deserialize<List<Musica>>(resposta)!;

    FiltroAnoLancamento.Artista(musicas, 2012);
    FiltroAnoLancamento.Musica(musicas, 2012);
    FiltroAnoLancamento.ArtistaEMusica(musicas, 2019);
}

Classe Musica:

using System.Text.Json.Serialization;

namespace ScreenSound_API.Modelo;

internal class Musica
{
    [JsonPropertyName("artist")]
    public string? Artista { get; set; }

    [JsonPropertyName("song")]
    public string? Nome { get; set; }

    [JsonPropertyName("year")]
    public string? AnoLancamentoString { get; set; }

    public int AnoLancamento
    {
        get
        {
            return AnoLancamentoString != null ? int.Parse(AnoLancamentoString) : 0;
        }
    }
}

Classe FiltroAnoLancamento:

using ScreenSound_API.Modelo;

namespace ScreenSound_API.Filtros;

internal class FiltroAnoLancamento
{
    public static void Artista(List<Musica> musicas, int anoLancamento)
    {
        var artistasQueLancaramMusicas = musicas
            .Where(m => m.AnoLancamento == anoLancamento)
            .OrderBy(m => m.Artista)
            .Select(m => m.Artista)
            .Distinct()
            .ToList();

        Console.WriteLine($"Artistas que lançaram musicas em {anoLancamento}:");

        foreach (var artista in artistasQueLancaramMusicas)
        {
            Console.WriteLine($"- {artista}");
        }
    }

    public static void Musica(List<Musica> musicas, int anoLancamento)
    {
        var musicasLancadas = musicas
            .Where(m => m.AnoLancamento == anoLancamento)
            .OrderBy(m => m.Nome)
            .Select(m => m.Nome)
            .Distinct()
            .ToList();

        Console.WriteLine($"Musicas lançaram em {anoLancamento}:");

        foreach (var musica in musicasLancadas)
        {
            Console.WriteLine($"- {musica}");
        }
    }

    public static void ArtistaEMusica(List<Musica> musicas, int anoLancamento)
    {
        var artistasQueLancaramMusicas = musicas
            .Where(m => m.AnoLancamento == anoLancamento)
            .OrderBy(m => m.Artista)
            .Select(m => m.Artista)
            .Distinct()
            .ToList();

        Console.WriteLine($"Artistas e musicas lançadas em {anoLancamento}:");

        foreach (var artista in artistasQueLancaramMusicas)
        {
            Console.WriteLine($"* {artista}");

            var musicasLancadas = MusicasPorArtista(musicas, artista!, anoLancamento);

            foreach (var musica in musicasLancadas)
            {
                Console.WriteLine($"  -> {musica}");
            }
        }
    }

    private static List<string> MusicasPorArtista(List<Musica> musicas, string artista, int anoLancamento)
    {
        var artistasQueLancaramMusicas = musicas
            .Where(m => m.Artista!.Equals(artista) && m.AnoLancamento == anoLancamento)
            .OrderBy(m => m.Nome)
            .Select(m => m.Nome)
            .Distinct()
            .ToList();

        return artistasQueLancaramMusicas!;
    }
}

Tentei explorar um pouco mais os filtros, onde criei um filtro para:

  • Artistas que tiveram musicas lançadas no ano X
  • Musicas que foram lançadas no ano X
  • Artistas e Musicas lançadas no ano X

Acredito que o método ArtistaEMusica da classe FiltroAnoLancamento ficou um pouco bagunçado, não sei se teria uma forma melhor de fazer, pois acabei repetindo um pouco de código.

Na classe Musica utilizei o comando int.Parse(AnoLancamentoString) mas verifiquei que também existe o comando Convert.ToInt32(AnoLancamentoString) qual a diferença dos 2 e quando se usa cada um?