2
respostas

[Dúvida] Por que o primeiro Login é identificado, mas os outros dois, não?

Eu escrevi o seguinte código como solução para o problema 4:

Dictionary<string, List<int>> logins = new()
{
    {"Pedro", new List<int>{6423}}, 
    {"João", new List<int>{5589}}, 
    {"CláudiaArraia123", new List<int>{5555}}
    
};

void Login()
{
    Console.Write("Usuário: ");
    string usuarioRespostaLogin = Console.ReadLine()!;
    if(logins.ContainsKey(usuarioRespostaLogin))
    {
        void Senha()
       { Console.Write("Senha: ");
        int usuarioRespostaSenha = int.Parse(Console.ReadLine()!);
        if(logins[usuarioRespostaLogin].Contains(usuarioRespostaSenha))
        {
            Console.WriteLine("Você está logado.");
            Thread.Sleep(5000);
            Console.Clear();
        }
        else
        {
            Console.WriteLine("Senha incorreta.");
            Thread.Sleep(2000);
            Console.Clear();
            Senha();
        }}
        Senha();
    }
    else
    {
        Console.WriteLine("Este usuário não existe.");
        Thread.Sleep(2000);
        Console.Clear();
        Login();
    }

}

Login();

Só que, no terminal, os logins "João" e "CláudiaArraia123" não são identificados, ele retorna o "Este usuário não existe.", mesmo que eu dê Ctrl+C, Ctrl+V, não vai. Teorizo que tenha algo a ver com os acentos das palavras, mas não sei como ajeitar.

2 respostas

Felipe, bom dia!

Você está no caminho certo, mas o problema que está enfrentando pode realmente estar relacionado aos acentos nos nomes dos usuários. Em C#, a comparação de strings é sensível a acentos, então "João" e "CláudiaArraia123" são diferentes de "Joao" e "ClaudiaArraia123".

Uma maneira de resolver isso é usar o método Normalize para normalizar as strings antes de compará-las. Você pode fazer isso alterando a forma como você lê o nome do usuário e como você armazena os nomes no dicionário. Abaixo um exemplo de como você pode modificar seu código:

using System.Globalization;

// ...

void Login()
{
    Console.Write("Usuário: ");
    string usuarioRespostaLogin = Console.ReadLine()!.Normalize(NormalizationForm.FormD);
    if(logins.ContainsKey(usuarioRespostaLogin))
    {
        void Senha()
        {
            Console.Write("Senha: ");
            int usuarioRespostaSenha = int.Parse(Console.ReadLine()!);
            if(logins[usuarioRespostaLogin].Contains(usuarioRespostaSenha))
            {
                Console.WriteLine("Você está logado.");
                Thread.Sleep(5000);
                Console.Clear();
            }
            else
            {
                Console.WriteLine("Senha incorreta.");
                Thread.Sleep(2000);
                Console.Clear();
                Senha();
            }
        }
        Senha();
    }
    else
    {
        Console.WriteLine("Este usuário não existe.");
        Thread.Sleep(2000);
        Console.Clear();
        Login();
    }
}

Login();

Note que eu usei Normalize(NormalizationForm.FormD) para remover os acentos antes de comparar as strings. Você também precisará garantir que os nomes de usuário no dicionário sejam armazenados na mesma forma normalizada.

Espero que isso ajude a resolver seu problema!

Bons estudos!

Bom dia, André

Infelizmente, não funcionou.

Mesmo eu usando o NormalizationForm.FormD, ele não identifica o nome "João", e mesmo eu escrevendo "Joao" sem acento na Chave, quando eu escrevo "João" com acento no terminal, ele continua não identificando.

Eu sou obrigado a desconsiderar o acento tanto no código quanto no terminal.

using System;
using System.Text;
using System.Globalization;

Dictionary<string, List<int>> logins = new()
{
    {"Pedro", new List<int>{6423}}, 
    {"Joao", new List<int>{5589}}, 
    {"ClaudiaArraia123", new List<int>{5555}}
    
};



// ...

void Login()
{
    Console.Write("Usuário: ");
    string usuarioRespostaLogin = Console.ReadLine()!.Normalize(NormalizationForm.FormD);
    if(logins.ContainsKey(usuarioRespostaLogin))
    {
        void Senha()
        {
            Console.Write("Senha: ");
            int usuarioRespostaSenha = int.Parse(Console.ReadLine()!);
            if(logins[usuarioRespostaLogin].Contains(usuarioRespostaSenha))
            {
                Console.WriteLine("Você está logado.");
                Thread.Sleep(5000);
                Console.Clear();
            }
            else
            {
                Console.WriteLine("Senha incorreta.");
                Thread.Sleep(2000);
                Console.Clear();
                Senha();
            }
        }
        Senha();
    }
    else
    {
        Console.WriteLine("Este usuário não existe.");
        Thread.Sleep(2000);
        Console.Clear();
        Login();
    }
}

Login();