Visual Studio C# 通用哈希 table 字典错误的 if 语句?

Visual Studio C# generic hash table dictionary wrong if statements?

我正在 Visual Studio 中创建一个 GUI,其中将创建字典 collection。这将包含 book 类 的实例,其中将包含字符串成员 Title、ISBN 和一个名为 Onloan 的布尔变量。这些成员将由用户输入并提交到字典中。用户还可以搜索他们输入的书籍并更改他们的借阅状态。

我希望程序能够搜索图书,即使用户只输入 ISBN 或书名,目前它只适用于同时搜索书名和 ISBN 的情况。如果用户只搜索 ISBN,则搜索结果文本框中的标题为空,如果用户仅搜索标题,ISBN 搜索结果文本框显示 "temp",这是我在临时书中使用的临时值我曾经搜索过。

一段时间以来,我一直在更改程序,试图找出发生这种情况的原因。我想知道是否有人可以解释一下。也许我写错了 if 语句。

图书Class

class Books
    {
        private String isbn;
        private string title;
        private Boolean onloan;

        public Books(string isbn, string title)
        {
            this.isbn = isbn;
            onloan = false;
        }
        public string ISBN
        {
            get { return this.isbn; }
            set { this.isbn = value; }
        }
        public string Title
        {
            get { return this.title; }
            set { this.title = value; }
        }
        public Boolean Onloan
        {
            get { return this.onloan; }
            set { this.onloan = value; }
        }
    }

表格:

public partial class Form1 : Form

     {


       Dictionary<string, Books> Library = new Dictionary<string, Books>();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)   //submit button
        {
            if ((String.IsNullOrWhiteSpace(TitleBox.Text) == false && String.IsNullOrWhiteSpace(ISBNBox.Text) == false) || 
                (String.IsNullOrEmpty(TitleBox.Text) == false && String.IsNullOrEmpty(ISBNBox.Text) == false))
            {
                Books LibBook = new Books(ISBNBox.Text, TitleBox.Text);
                if(LoanRadial.Checked == true)
                    {
                    LibBook.Onloan = true;
                    LoanRadial.Checked = false;
                    }

                Library.Add(ISBNBox.Text, LibBook);
                TitleBox.Clear();
                ISBNBox.Clear();
                //int count = Library.Count();
                //ISBNBox.Text = count.ToString();

            }
        }

        private void Remove_Click(object sender, EventArgs e)
        {
            Library.Remove(ISBNBox.Text);
            TitleBox.Clear();
            ISBNBox.Clear();
            if (LoanRadial.Checked == true)
            {
                LoanRadial.Checked = false;
            }
        }

        private void Search_Click(object sender, EventArgs e)
        {
            string tempstring = "temp";
            Books tempbook = new Books(tempstring, tempstring);
            if ((String.IsNullOrWhiteSpace(ISBNBox.Text) == false && String.IsNullOrWhiteSpace(TitleBox.Text) == true) ||
                (String.IsNullOrEmpty(ISBNBox.Text) == false && String.IsNullOrEmpty(TitleBox.Text) == true))
            {

                tempbook.ISBN = ISBNBox.Text;
                foreach (KeyValuePair<string, Books> element in Library)
                {
                    if (tempbook.ISBN == element.Value.ISBN)
                    {
                        tempbook.Title = element.Value.Title;
                        tempbook.Onloan = element.Value.Onloan;
                    }
                }
                Titlebox2.Text = tempbook.Title;
                ISBN2.Text = tempbook.ISBN;
                if (tempbook.Onloan == true)
                {
                    LoanBox.Text = tempbook.Title + " Is on loan";
                }
                else
                {
                    LoanBox.Text = tempbook.Title + " Is not on loan";
                }

            }
            else if ((String.IsNullOrWhiteSpace(ISBNBox.Text) == true && String.IsNullOrWhiteSpace(TitleBox.Text) == false) ||
                (String.IsNullOrEmpty(ISBNBox.Text) == true && String.IsNullOrEmpty(TitleBox.Text) == false))
            {
                tempbook.Title = TitleBox.Text;
                foreach (KeyValuePair<string, Books> element in Library)
                {
                    if (tempbook.Title == element.Value.Title)
                    {

                        tempbook.ISBN = element.Value.ISBN;
                        tempbook.Onloan = element.Value.Onloan;
                    }
                }
                Titlebox2.Text = tempbook.Title;
                ISBN2.Text = tempbook.ISBN;
                if (tempbook.Onloan == true)
                {
                    LoanBox.Text = tempbook.Title + " Is on loan";
                }
                else
                {
                    LoanBox.Text = tempbook.Title + " Is not on loan";
                }
            }
            else if ((String.IsNullOrWhiteSpace(ISBNBox.Text) == false && String.IsNullOrWhiteSpace(TitleBox.Text) == false) ||
                    (String.IsNullOrEmpty(ISBNBox.Text) == false && String.IsNullOrEmpty(TitleBox.Text) == false))
            {

                tempbook.ISBN = ISBNBox.Text;
                tempbook.Title = TitleBox.Text;
                foreach (KeyValuePair<string, Books> element in Library)
                {
                    if ((tempbook.Title == element.Value.Title) &&  (tempbook.ISBN == element.Value.ISBN) )
                    {
                        tempbook.Onloan = element.Value.Onloan;
                    }                   
                }
                Titlebox2.Text = tempbook.Title;
                ISBN2.Text = tempbook.ISBN;
                if (tempbook.Onloan == true)
                {
                    LoanBox.Text = tempbook.Title + " Is on loan";
                }
                else
                {
                    LoanBox.Text = tempbook.Title + " Is not on loan";
                }

            }
        }

        private void Changeloan_Click(object sender, EventArgs e)
        {
            string tempstring = "temp";
            Books tempbook = new Books(tempstring, tempstring);
            if ((String.IsNullOrWhiteSpace(ISBN2.Text) == false && String.IsNullOrWhiteSpace(Titlebox2.Text) == false) ||
                (String.IsNullOrEmpty(ISBN2.Text) == false && String.IsNullOrEmpty(Titlebox2.Text) == false))
            {
                tempbook.ISBN = ISBN2.Text;
                tempbook.Title = Titlebox2.Text;
                foreach (KeyValuePair<string, Books> element in Library)
                {
                    if ((tempbook.ISBN == element.Value.ISBN) && (tempbook.Title == element.Value.Title))
                    {

                        if (element.Value.Onloan == true)
                        {
                            element.Value.Onloan = false;
                            LoanBox.Text = tempbook.Title + " Is not on loan";
                        }
                        else
                        {
                            element.Value.Onloan = true;
                            LoanBox.Text = tempbook.Title + " Is not on loan";
                        }
                    }
                }
            }                  
            else if ((String.IsNullOrWhiteSpace(ISBN2.Text) == true && String.IsNullOrWhiteSpace(Titlebox2.Text) == false) ||
                (String.IsNullOrEmpty(ISBN2.Text) == true) && (String.IsNullOrEmpty(Titlebox2.Text) == false))
            {
                tempbook.Title = Titlebox2.Text;
                foreach (KeyValuePair<string, Books> element in Library)
                {
                    if(tempbook.Title == element.Value.Title)
                    {
                        if (element.Value.Onloan == true)
                        {
                            element.Value.Onloan = false;
                            LoanBox.Text = element.Value.Title + " Is not on loan";

                        }
                        else if (element.Value.Onloan == false)
                        {
                            element.Value.Onloan = true;
                            LoanBox.Text = element.Value.Title + " Is on loan";
                        }
                    }
                }

                    }
            else if((String.IsNullOrWhiteSpace(ISBN2.Text) == false) && (String.IsNullOrWhiteSpace(Titlebox2.Text) == true) || 
                (String.IsNullOrEmpty(ISBN2.Text) == false) && (String.IsNullOrEmpty(Titlebox2.Text) == true))
            {
                tempbook.ISBN = ISBN2.Text;
                foreach (KeyValuePair<string, Books> element in Library)
                {
                    if (tempbook.ISBN == element.Value.ISBN)
                    {
                        if (element.Value.Onloan == true)
                        {
                            element.Value.Onloan = false;
                            LoanBox.Text = element.Value.Title + " Is not on loan";

                        }
                        else if (element.Value.Onloan == false)
                        {
                            element.Value.Onloan = true;
                            LoanBox.Text = element.Value.Title + " Is on loan";
                        }
                    }
                }
            }

            }
        }

Books form picture

您正在使用 Dictionary,但更多的是作为元组列表而不是适当的散列 table。我假设您的密钥是 ISBN,在这种情况下,您可能会像这样从字典中获取这本书:

String isbn = ISBNBox.Text; //Assuming the TextBox.Text is valid
if(Library.ContainsKey(isbn))
{
    Books book = Library[isbn];
    //Do whatever you want to do with the book
}

解决问题的另一方面,文本被设置为 tempbook ISBN "temp",任何时候在图书馆中找不到输入的标题或 ISBN,它们将设置为临时值。这是因为你设置的是教科书值

Titlebox2.Text = tempbook.Title;
ISBN2.Text = tempbook.ISBN;

即使在字典中找不到这本书。考虑一下找不到书的情况。

如果 ISBN 确实是您的密钥,那么如果他们提供了 ISBN,则无需担心书名。如果他们只给你标题,你真的只需要遍历字典。此外,您可以在最后设置 UI 属性以减少一些冗余代码。下面是一些重构代码,用于在找不到书时处理代码:

private void Search_Click(object sender, EventArgs e)
{
    Books tempbook = null;
    if (String.IsNullOrWhiteSpace(ISBNBox.Text) == false && String.IsNullOrEmpty(ISBNBox.Text) == false)
    {
        String isbn = ISBNBox.Text;
        if(Library.ContainsKey(isbn)){
            tempbook = Library[isbn];
        }

    }
    else if (String.IsNullOrWhiteSpace(TitleBox.Text) == false && String.IsNullOrEmpty(TitleBox.Text) == false)
    {
        String title = TitleBox.Text;
        foreach (KeyValuePair<string, Books> element in Library)
        {
            if (element.Value.Title == title)
            {

                tempbook = element.Value;
                break;
            }
        }
    }    
    if(tempbook != null)
        Titlebox2.Text = tempbook.Title;
        ISBN2.Text = tempbook.ISBN;
        if (tempbook.Onloan == true)
        {
            LoanBox.Text = tempbook.Title + " Is on loan";
        }
        else
        {
            LoanBox.Text = tempbook.Title + " Is not on loan";
        }

    } else {
    //Handle case where book is not found
    }
}

此外,您描述一本书的 class 称为 Books,但由于 class 中的单个 object 只是一本书,它可能是最好简单地命名为 Book.