1
resposta

Preciso de ajuda

Criei um sistema de controle de estoque com base nas aulas de C#. Porem, eu ainda nao vi como remover um intem da list de um dicionario. eu conssigo remover o item por completo, mas não consigo remover a quantidade. meu codigo roda mas não remove. obs: tentei deixar ele o mais limpo possivel para facilitar na hora de ler. Pesquisei, porem a unica solução que eu achei seriam varios if e elses o que deixaria meu codigo pesado. Segue abaixo o codigo:

//CONTROLE DE ESTOQUE

Dictionary<string, List> produtosRegistrados = new Dictionary<string, List>();

Console.WriteLine("Controle de estoque:");
ExibirMenu();

void ExibirMenu()
{
Console.Clear();
Console.WriteLine("\nDigite 01 para: Registrar produto.");
Console.WriteLine("Digite 02 para: Produtos registrados.");
Console.WriteLine("Digite 03 para: Quantidade em estoque.");
Console.WriteLine("Digite 04 para: Remover.");
Console.WriteLine("Digite 05 para: Sair.");

Console.Write("\nDigite a sua opção: ");
int opcaoEscolhida = int.Parse(Console.ReadLine()!);

switch (opcaoEscolhida)
{
    case 1: RegistrarProduto();
        break;
    case 2: ProdutosRegistrados();
        break;
    case 3: QuantidadeEmEstoque();
        break;
    case 4: Remover();
        break;
    case 5: Console.WriteLine("Sessão encerrada!");
        break;
    default: Console.WriteLine("Opção invalida.");
        ExibirMenu();
        break;
}

}

void VoltarAoMenu()
{
Console.WriteLine("Digite uma tecla para voltar ao menur inicial.");
Console.ReadKey();
Console.Clear();
ExibirMenu();
}

void RegistrarProduto()
{
string nomeDoProduto;
int quantidade, voltarAoMenu;

do
{
Console.Clear();
Console.Write("Nome do produto: ");
nomeDoProduto = Console.ReadLine()!;

    Console.Write("Quantidade: ");
    quantidade = int.Parse(Console.ReadLine()!);
    

    if (produtosRegistrados.ContainsKey(nomeDoProduto))
    {
         produtosRegistrados[nomeDoProduto].Add(quantidade);
    }
    else
    {  
        produtosRegistrados.Add(nomeDoProduto, new List<int> { quantidade });
    }
   
    Console.Write("Deseja continuar?\n1 - Sim | 0 - Não:\n");
    voltarAoMenu = int.Parse(Console.ReadLine()!);
    
} while(voltarAoMenu != 0);
ExibirMenu();

}

void ProdutosRegistrados()
{
Console.Clear();
foreach (string produto in produtosRegistrados.Keys)
{
Console.WriteLine($"Produtos registrados:\n{produto}");
}

VoltarAoMenu();

}

void QuantidadeEmEstoque()
{
Console.Clear();
Console.Write("Nome do Produto: ");
string nomeDoProduto = Console.ReadLine()!;

if (produtosRegistrados.ContainsKey(nomeDoProduto))
{
    List<int> estoque = produtosRegistrados[nomeDoProduto];
    Console.WriteLine($"\nO produto {nomeDoProduto} tem {estoque.Sum()} unidades.");
    VoltarAoMenu();
}else
{
    Console.WriteLine($"\nO produto {nomeDoProduto} não foi encontrado!");
    VoltarAoMenu();
}

}

void Remover()
{
Console.Clear();
Console.Write("O que deseja remover:\n1 - Produto | 2 - Quantidade:\n");
int opcaoEscolhida = int.Parse(Console.ReadLine()!);

Console.Clear();
Console.Write("Qual produto deseja remover: ");
string nomeDoProduto = Console.ReadLine()!;


if (!produtosRegistrados.ContainsKey(nomeDoProduto))
{
    Console.WriteLine("Produto não encontrado.");
    VoltarAoMenu();
    return;
}

List<int> estoque = produtosRegistrados[nomeDoProduto];

switch (opcaoEscolhida)
{
    case 1:
        
        produtosRegistrados.Remove(nomeDoProduto);
        Console.WriteLine($"O produto '{nomeDoProduto}' foi removido com sucesso!");
        break;

    case 2:
        Console.Write("\nQuantas unidades deseja remover: ");
        int quantidade = int.Parse(Console.ReadLine()!);

        if (estoque.Contains(quantidade))
        {
            estoque.Remove(quantidade);

            if (estoque.Count == 0)
                produtosRegistrados.Remove(nomeDoProduto);

            Console.WriteLine($"Foi removido {quantidade} do estoque com sucesso!");
        }
        else
        {
            Console.WriteLine($"O estoque não possui {quantidade} unidades desse produto.");
        }
        break;

    default:
        Console.WriteLine("Opção inválida.");
        break;
}

VoltarAoMenu();

}

1 resposta

Bom dia, Edla! Tudo bem?

O seu sistema está tentando remover uma quantidade específica de unidades de um produto, mas o método Remove que você está usando na lista estoque está buscando por um valor exato na lista, e não uma quantidade para subtrair.

Se você quer subtrair uma quantidade do estoque de um produto, você pode fazer isso de uma forma diferente. Em vez de armazenar várias quantidades na lista, você pode armazenar apenas o total de unidades do produto. Assim, quando quiser remover uma quantidade, basta subtrair esse valor do total. Vou te mostrar como você pode ajustar seu código:

  1. Primeiro, ao registrar um produto, em vez de adicionar uma nova quantidade à lista, você pode somar à quantidade existente:

    if (produtosRegistrados.ContainsKey(nomeDoProduto))
    {
        produtosRegistrados[nomeDoProduto][0] += quantidade;
    }
    else
    {
        produtosRegistrados.Add(nomeDoProduto, new List<int> { quantidade });
    }
    
  2. Para remover uma quantidade, subtraia do total:

    case 2:
        Console.Write("\nQuantas unidades deseja remover: ");
        int quantidade = int.Parse(Console.ReadLine()!);
    
        if (estoque[0] >= quantidade)
        {
            estoque[0] -= quantidade;
    
            if (estoque[0] == 0)
                produtosRegistrados.Remove(nomeDoProduto);
    
            Console.WriteLine($"Foi removido {quantidade} do estoque com sucesso!");
        }
        else
        {
            Console.WriteLine($"O estoque não possui {quantidade} unidades desse produto.");
        }
        break;
    

Com essas alterações, você está sempre mantendo o total de unidades de cada produto em uma lista de um único elemento, o que facilita a adição e remoção de quantidades sem precisar lidar com múltiplas entradas na lista.

Espero ter ajudado e bons estudos!

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