Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

[Dúvida] - Exibir todos os gêneros musicais da lista

Tentei utilizar LINQ para filtrar todos os gêneros, mas o distinct não funciona, poderiam me ajudar? Pelo que pesquisei (e falando com a Luri), a sintaxe estaria correta. No entanto, não está fazendo o que deveria. Por exemplo, exibir "pop" uma única vez, e todos os gêneros em ordem alfabética.

using System.Text.Json.Serialization;

namespace ScreenSoundAPI.Models;

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

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

    [JsonPropertyName("duration_ms")]
    public int Duracao { get; set; }

    [JsonPropertyName("genre")]
    public string? Genero { get; set; }

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

    public static string ExibeGenerosMusicais(List<Musica> musicas)
    {
        var generos = musicas.Select(musica => musica.Genero) // Seleciona os gêneros
                             .Where(g => g != null) // Filtra os valores null
                             .Distinct() // Distinct ignorando dif entre maiúscula/minúscula
                             .OrderBy(g => g); // Ordena por ordem alfabética

        string generosString = $"Gêneros musicais encontrados: {string.Join("\n ", generos)}";
        return generosString;
    }
}
5 respostas

Edit: Consegui fazer por fora, mas gostaria de saber como fazer utilizando o LINQ, já que é o foco da aula. No meu código o Distinct parece que não estava funcionando, gostaria de saber o porquê disso, e como resolveria (ainda utilizando LINQ).

Oi Izabela, tudo bem?

O trecho de código que você compartilhou está funcionando corretamente, então peço que compartilhe todo o seu projeto, usando o GitHub ou Drive do Google.

Além disso, deixe mais claro o problema de filtragem que você está tendo ao usando o LinQ, pois, usando o seu código de exibição dos gêneros, consegui fazer a listagem dos gêneros e de forma alfabética.

Fico no aguardo e à disposição

Olá, obg pelo retorno. No caso a dúvida é referente à aula, como citei, onde há o desafio de filtrar todos os gêneros musicais da lista. No entanto, a API trás alguns gêneros em forma de array, e outros itens vem simplesmente em forma de string, se não estiver falando bobeira. Assim, estava filtrando apenas os elementos simples, e não os elementos em array. Algo assim. Para resolver tive que fazer por fora, sem utilizar o LINQ.

Anexarei o link do meu repositório, mas é importante citar que lá, essa parte do código que não está funcionando, está comentada na classe Musica.cs. O código que que funcionou está na classe LinqFilters.cs, porém essa não utiliza LINQ. Se possível, gostaria de implementá-la.

https://github.com/izaleme/ScreenSoundAPI

solução!

Bom dia Izabela, tudo bem?

Segue um exemplo de como você pode resolver o seu problema utilizando o SelectMany do linq.

public static string ExibeGenerosMusicais(List<Musica> musicas)
{
    var generos = musicas.Where(g => !String.IsNullOrEmpty(g.Genero.Trim()))
                         .SelectMany(musica => musica.Genero.Split(',', StringSplitOptions.TrimEntries))
                         .OrderBy(y => y)
                         .Distinct()
                         .ToList();

    string generosString = $"Gêneros musicais encontrados: {string.Join("\n ", generos)}";
    return generosString;
}

Explicando detalhadamente cada etapa para você entender melhor a solução do seu problema:

1º Where - Realizar a busca em todos elementos que não são nulos e vazios aplicando um Trim antes para remover espaços antes e depois da string. 2º SelectMany - É utilizado para transformar uma coleção (com coleções) em uma sequência única. Seguindo seu exemplo:

Generos: - Pop, Rock - Jazz, Sertanejo

Transforma em:

Generos: - Pop - Rock - Jazz - Sertanejo

3º OrderBy - Ordena os itens da lista. 4º Distinct - Remove elementos duplicados. 5º ToList - Retorna uma lista.

Espero ter ajudado, conte comigo.

Você entendeu o problema e resolveu facilmente, até me sinto boba pelo trabalho que tive fazendo sem LINQ. Funcionou perfeitamente! Muito obg!!