从一个位置访问潜在的代码更改

问题描述

我是一名新程序员,业余爱好学习C#。我正在编写一个图书馆导航器,用户可以在其中按名称,流派,作者等搜索书籍。我正在结束该项目,到目前为止,我已经解决了所有问题并自行解决了这些问题。但是我现在陷入困境,因此写了StackOverflow来寻求专家的帮助。我将尝试尽可能清楚地解释我的问题。

我的节目目前具有4种类型的图书:恐怖,小说,幻想和神秘。

由于将来我可能会添加更多类型,所以我不想自己浏览数百行代码来编辑if / case语句并添加新类型。

是否存在一种实用的方法将将来可能编辑的所有信息集中到一个地方?

下面是我声明的列表:

    public static List<string> bookList = new List<string> {"shindler's list","it","maltese falcon","bfg","hobbit"};
    public static List<string> fiction = new List<string> {"shindler's list"};
    public static List<string> fantasy = new List<string> {"bfg","hobbit"};
    public static List<string> horror = new List<string> {"it"};
    public static List<string> mystery = new List<string> {"maltese falcon"};

现在,这些列表是从代码的各个部分调用的,例如:

case "1":
                Seperation();
                Console.Clear();

                Console.Write("Enter book name: ");
                var bookTitleUserInput = Console.ReadLine();

                Console.WriteLine("You searched for: " + bookTitleUserInput);

                foreach (string s in bookList)
                {
                    if (s.ToLowerInvariant() == bookTitleUserInput.ToLowerInvariant())
                    {
                        Console.WriteLine("\n");
                        Seperation();
                        OutputBookSummary(bookTitleUserInput.ToLowerInvariant());
                        Seperation();
                        if (fiction.Contains(bookTitleUserInput.ToLowerInvariant()))
                        {
                            Console.WriteLine("Genre: Fiction");
                            Console.WriteLine("\n");
                        }
                        else if (horror.Contains(bookTitleUserInput.ToLowerInvariant()))
                        {
                            Console.WriteLine("Genre: Horror");
                            Console.WriteLine("\n");
                        }
                        else if (mystery.Contains(bookTitleUserInput.ToLowerInvariant()))
                        {
                            Console.WriteLine("Genre: Mystery");
                            Console.WriteLine("\n");
                        }
                        else if (fantasy.Contains(bookTitleUserInput.ToLowerInvariant()))
                        {
                            Console.WriteLine("Genre: Fantasy");
                            Console.WriteLine("\n");
                        }
                        else
                        {
                            Console.WriteLine("");
                        }

                        break;
                    }
                }

和类似的代码

                case "4":
                Console.Clear();
                Console.WriteLine("Settings Menu");
                Seperation();
                Console.WriteLine("1) Search By Genre");
                Console.WriteLine("2) Search By Author");
                Console.WriteLine("3) Search By Book Name");
                Console.WriteLine("4) Back to Main Menu");
                Seperation();

                Console.Write("Choice: ");
                var settingsMenuSelection = Console.ReadLine();

                switch (settingsMenuSelection)
                {
                    case "1":
                        Console.WriteLine("1) Horror");
                        Console.WriteLine("2) Mystery");
                        Console.WriteLine("3) Fiction");
                        Console.WriteLine("4) Fantasy");
                        var genreMenuSelection = Console.ReadLine();

                        break;

如此,如果我必须编辑代码添加更多类型,则必须滚动浏览代码并单独进行编辑。更不用说这会造成的混乱和混乱。

我尝试将case 1:的if语句块放在单独的方法中,但是没有用。我还尝试将所有内容放在另一个类中,然后从那里调用case 1:case 4:,但这也没有用。

不起作用,是指Genre: +类型未在控制台上输出

因此,总而言之,有没有一种方法可以集中所有上述代码,因此,如果有新书/体裁/作者出现,我就不必导航了?因为我认为这是不好的做法。

在此先谢谢您的感谢!

解决方法

典型的解决方案是使用面向对象的方式将书籍与其类型相关联。像这样

public enum Genre
{
    Horror,Fiction,Fantasy,Mystery
}

public class Book
{
    public string Title { get; }
    public Genre Genre { get; }
    public Book(string title,Genre genre) => (Title,Genre) = (title,genre);
}

,您可以按类型过滤书籍或按标题搜索,例如:

        var books = new[]
        {
            new Book("bfg",Genre.Fiction),new Book("it",Genre.Horror),};
        var horrorBooks = books.Where(b => b.Genre == Genre.Horror);
        var foundByname = books.FirstOrDefault(b => b.Title.Contains("MySearchTerm"));

将来,您可能希望扩展书籍,使其具有类别列表,而不是单个类别。您还可以继续添加诸如author,ISBN等属性。可以将书籍列表序列化为json文件进行存储,或者使用诸如实体框架之类的书籍将其存储在数据库中。确切的方法将取决于您对系统的要求。我鼓励您阅读一些有关数据库的文章,以进一步了解该主题,尤其是数据库规范化。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...