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
.
我正在 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
.