Альтернатива функции goto и несколько печатаемых строк в результатах - PullRequest
0 голосов
/ 05 мая 2020

Надеюсь, что кто-нибудь сможет помочь. Я все еще многому учусь каждый день, будучи новичком. Но у вас есть несколько проблем с приведенным ниже.

  1. Использование goto является недопустимым из исследований, которые я видел, но я не могу найти альтернативу l oop для добавить пока может? Или делать?

  2. Когда я ввожу текст, который, как я знаю, не вернет результат, например, dsfgfhg, и нажимаю клавишу ВВОД, я получаю в результатах трижды «Ресурс не найден». Я предполагаю, что это потому, что в списке есть три записи, и ни одна не соответствует. Как получить один результат вместо трех, если ресурс не найден?

  3. Если я дважды нажму Enter в окне консоли, не вводя никакого текста, он вернет все в списке. Я снова не вижу способа остановить это. Думаю, мне нужно каким-то образом изменить код, чтобы он был явным?

Еще раз спасибо за вашу помощь.

using System;
using System.Collections.Generic;
class JunkList
{
    public string Resource { get; set; }
    public string Junk { get; set; }
    public int Amount { get; set; }

    public JunkList(string r, string j, int a)
    {
        this.Resource = r;
        this.Junk = j;
        this.Amount = a;
    }
}

class Program
{
    static void Main(string[] args) // this is a method called "Main" . It is called when the program starts.
    {
        start: 
        string searchName;
        List<JunkList> infoList = new List<JunkList>();
        infoList.Add(new JunkList("Screw", "Type Writer", 2));
        infoList.Add(new JunkList("Screw", "Clip Board", 1));
        infoList.Add(new JunkList("Screw", "Toy Car", 3));
        Console.WriteLine("Which resource do you want to search for?? \n");
        searchName = Console.ReadLine();
        for (int i = 0; i < infoList.Count; i++)
        {
            if (infoList[i].Resource.ToLowerInvariant().Contains(searchName.ToLowerInvariant()))
            {
                Console.WriteLine("Resource : " + infoList[i].Resource + "\n");
                Console.WriteLine("Junk : " + infoList[i].Junk + "\n");
                Console.WriteLine("Resource Amount : " + infoList[i].Amount + "\n");

            } 
            else {

                 Console.WriteLine("Resource Not found <Press Enter to perform a new search>");
            } 
        }
        // wait for user to press a key. Then make an empty space and start over.
        Console.ReadKey();
        Console.WriteLine();
        goto start; // go to start and run again
    }
} 

1 Ответ

0 голосов
/ 05 мая 2020

Я рекомендую вам использовать «принцип единственной ответственности». В вашем случае это означает, что вы должны разделить свой метод Main на более мелкие методы. Эти методы выполняют одно простое действие - ответственность.

Что ж, поможет:

  1. Вы правы goto довольно часто является плохой практикой (но не всегда). Поместите свой код в while(true), и он будет делать то же самое, но более четко. Однако для правильного закрытия вашего приложения было бы лучше получить некоторый символ или ключ для выхода, например,

    bool _runApplication = true;
    while (_runApplication)
    {
        // code between "start:" and "goto start;"
    
        if (Console.Read() == 'x')
        {
            _runApplication = false;
        }
    }
    
  2. Для решения этого множественного вывода Resource Not found вы можете разделить поиск по имени и печати результаты поиска, например

            string searchName = Console.ReadLine();
            List<JunkList> searchResult = GetJunkListsBySearchName(infoList, searchName);
    
            if (searchResult.Count != 0)
            {
                foreach (var junkList in searchResult)
                { 
                    Console.WriteLine("Resource : " + junkList.Resource + "\n");
                    Console.WriteLine("Junk : " + junkList.Junk + "\n");
                    Console.WriteLine("Resource Amount : " + junkList.Amount + "\n");
                }
            }
            else
            {
                Console.WriteLine("Resource Not found <Press Enter to perform a new search>");
            }
    

, где новый метод:

    private static List<JunkList> GetJunkListsBySearchName(List<JunkList> infoList, string searchName)
    {
        List<JunkList> output = new List<JunkList>();

        foreach (var junkList in infoList)
        {
            if (junkList.Resource.ToLowerInvariant().Contains(searchName.ToLowerInvariant()))
            {
                output.Add(junkList);
            }
        }

        return output;
    }

Это потому, что searchName равно пустой строке. Добавьте простой if, чтобы решить его.

        if (searchName.Length > 0 &&
            junkList.Resource.ToLowerInvariant().Contains(searchName.ToLowerInvariant()))
        {
            output.Add(junkList);
        }

Применяя все эти точки, вы получите такой код (только Program класс изменен):

class Program
{
    static void Main(string[] args)
    {
        bool _runApplication = true;

        while (_runApplication)
        {
            List<JunkList> infoList = CreateJunkList();
            Console.WriteLine("Which resource do you want to search for?? \n");

            string searchName = Console.ReadLine();
            List<JunkList> searchResult = GetJunkListsBySearchName(infoList, searchName);

            if (searchResult.Count != 0)
            {
                PrintJunkLists(searchResult);
            }
            else
            {
                Console.WriteLine("Resource Not found <Press Enter to perform a new search>");
            }

            Console.WriteLine();

            if (Console.Read() == 'x')
            {
                _runApplication = false;
            }
        }
    }

    private static List<JunkList> CreateJunkList()
    {
        List<JunkList> infoList = new List<JunkList>();
        infoList.Add(new JunkList("Screw", "Type Writer", 2));
        infoList.Add(new JunkList("Screw", "Clip Board", 1));
        infoList.Add(new JunkList("Screw", "Toy Car", 3));

        return infoList;
    }

    private static void PrintJunkLists(List<JunkList> junkLists)
    {
        foreach (var junkList in junkLists)
        {
            PrintJunkList(junkList);
        }
    }

    private static void PrintJunkList(JunkList junkList)
    {
        Console.WriteLine("Resource : " + junkList.Resource + "\n");
        Console.WriteLine("Junk : " + junkList.Junk + "\n");
        Console.WriteLine("Resource Amount : " + junkList.Amount + "\n");
    }

    private static List<JunkList> GetJunkListsBySearchName(List<JunkList> infoList, string searchName)
    {
        List<JunkList> output = new List<JunkList>();

        foreach (var junkList in infoList)
        {
            if (searchName.Length > 0 &&
                junkList.Resource.ToLowerInvariant().Contains(searchName.ToLowerInvariant()))
            {
                output.Add(junkList);
            }
        }

        return output;
    }
}

надеюсь помогло)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...