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

C# 从一个位置访问代码中的潜在更改,c#,list,static-methods,centralized,C#,List,Static Methods,Centralized,我是一名新程序员,学习C#是一种爱好。我正在编写一个图书馆导航器,用户可以在其中按姓名、流派、作者等搜索书籍。。我即将结束这个项目,到目前为止,我已经解决了所有的问题,并解决了我自己的问题。但我现在陷入困境,因此我在StackOverflow上写文章,寻求专家的帮助。我会尽可能清楚地解释我的问题 我的节目目前有4种图书类型:恐怖、小说、幻想和神秘 因为将来我可能会添加更多类型,所以我不想在数百行代码中浏览来编辑if/case语句并添加新类型 有没有一种切实可行的方法将我将来可能编辑的所有信息集中

我是一名新程序员,学习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 "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;
所以像这样,如果我必须编辑代码来添加更多的类型,我必须滚动我的代码并单独编辑它们。更不用说这会造成混乱和混乱

我曾尝试将
案例1:
的if语句块放在一个单独的方法中,但没有成功。我还尝试将所有内容放在另一个类中,并从那里调用块
case1:
case4:
,但这也不起作用

不工作,我的意思是
流派:
+该流派没有在控制台上输出

那么,简而言之,有没有一种方法可以集中上面所有的代码,这样如果有新书/流派/作者出现,我就不必导航了?因为我认为那是一种糟糕的做法


提前谢谢,很抱歉发了这么长的帖子

典型的解决方案是使用面向对象技术将一本书与其类型关联起来。像这样的

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文件中进行存储,也可以使用实体框架之类的东西将书籍存储在数据库中。确切的方法取决于您对系统的要求。我鼓励您阅读一些关于数据库的文章,以便更深入地了解该主题,尤其是数据库规范化。

您有硬编码列表,因此您已经“锁定”了。通常,您会将数据保存在中央数据存储中,例如数据库。然后,“流派”可能是一个表(或集合,但为了论证起见,让我们坚持使用关系数据库),一本书的特定流派将是从“book”表的一列引用到该表中。然后,应用程序中的数据访问层会将您的商业案例“转换”为相关查询(创建、读取、更新、删除)并输入数据库。^^^因此,如果您再添加一种类型,就很容易在类型表中插入另一行。正如@Fildor所说,数据库是理想的,但如果您不想变得如此复杂,您仍然可以将它们存储在JSON或XML文件中。然后编写与之接口的数据层。这也给了您一个好处,即如果您以后想迁移到更传统的数据库,您只需要更改数据层。@gmiley我通常同意,但由于像SQLite这样的单文件数据库是免费提供的,我觉得基于文件(json/xml)的数据存储要差一些。但那只是我。(尽管一切都有它的位置)我想我会把它放在那里,因为对于一个新的开发者来说,可能更需要担心设置它。对于一个可以为进一步研究和学习争取时间的快速解决方案来说,对小数据集的简单文件访问是非常好的。非常感谢!我会研究一下你的建议。
        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"));