【问题标题】:Searching Dictionary value of Object Book with substring使用子字符串搜索对象书的字典值
【发布时间】:2015-12-19 07:52:22
【问题描述】:

我有一个带有几个按钮(添加书籍、删除书籍、搜索等)的图书馆 GUI,它使用字典。 Book 构造函数有 2 个参数,ISBN 和标题。我有 2 个文本框,在添加之前询问用户 ISBN 和标题。我正在使用library[ISBNtext.Text] = new Book(ISBNtext.Text, TITLEtext.Text); 创建新书并将它们添加到字典中。我需要搜索按钮来通过 ISBN 或使用子字符串的标题搜索字典中的书籍(搜索“猫”将返回“如何照顾你的猫”)。

我的代码如下:

private void searchButton_Click(object sender, EventArgs e)
{
    libraryList.Items.Clear();

    foreach (KeyValuePair<string, Book> book in library)
    {
        if (book.Key.Contains(ISBNtext.Text) || book.Value.Title.Contains(TITLEtext.Text))
        {
            libraryList.Items.Add(String.Format("{0} = {1}", book.Key, book.Value.Title));
        }
    }

    ISBNtext.Clear();
    TITLEtext.Clear();
}

如果我添加一些简单的书(ISBN:1 - TITLE:1,ISBN:2 - TITLE:2,ISBN:3 - TITLE:3 等)并搜索 1,它只会显示每本书已添加,而不仅仅是我搜索的。

我还应该提到,这是给学校的,所以我不确定我可以使用任何图书馆或任何东西。

【问题讨论】:

  • ISBN 也可以部分匹配吗?字典的目的是(完整)键提供对象的快速查找。您根本没有使用它,而是对项目进行了蛮力搜索。您还不如使用列表。
  • 在我根据 Akshey 的回答对其进行更改后,我认为它也会返回部分 ISBN 匹配项。这也是明确提到使用字典的工作表的一部分。
  • 对于 ISBN,最好使用 == 运算符而不是 contains()。
  • 我同意,使用单独的 if 语句并将 ISBN 检查更改为 == 而不是 contains() 并且一切都按预期工作。

标签: c# dictionary


【解决方案1】:

我认为其他答案可能已经解决了您的代码中的问题,但是如果您被要求使用字典,您应该考虑是否应该充分利用它提供的方法。

Dictionary 的目的是提供对存储对象的快速查找,与完整搜索列表相比,这可以节省时间。

作为示例,我已将您的搜索分为两个单独的搜索。第一个匹配完整的 ISBN 号(如果提供)并使用字典的键作为快速查找。第二个是较慢的标题搜索,您可以使用已有的代码(只需删除其中的 ISBN 部分)。

private void searchButton_Click(object sender, EventArgs e)
{
    libraryList.Items.Clear();

    // ISBN number search
    var isbnNo = ISBNtext.Text;
    if (!string.IsNullOrEmpty(isbnNo)){
      if (library.ContainsKey(isbnNo)){
        var book = library[isbnNo];
        libraryList.Items.Add(String.Format("{0} = {1}", book.ISBNNo, book.Title));
      }
    }

    // Title search
    var titleText = TITLEtext.Text;
    if (!string.IsNullOrEmpty(titleText)){
      foreach (KeyValuePair<string, Book> book in library)
      {
          // search based on title like your existing code
      }
    }

    ISBNtext.Clear();
    TITLEtext.Clear();
}

【讨论】:

    【解决方案2】:

    您还需要检查ISBNtext.TextTITLEtext.Text 是否为空。如果其中任何一个为空contains() 将返回true。这就是您得到错误结果的原因。在 if 子句中添加条件如下:-

    if ((book.Key.Contains(ISBNtext.Text) && book.Key != string.Empty) || (book.Value.Title.Contains(TITLEtext.Text) && book.Value.Title != string.Empty) )
            {
                libraryList.Items.Add(String.Format("{0} = {1}", book.Key, book.Value.Title));
            }
    

    【讨论】:

    • 如果我不想强制用户同时输入 ISBN 和标题(如果他们只想搜索其中一个),那么使用两个单独的 if 语句会更好吗?
    • 是的,您也可以这样做。或者您可以在 if 子句中添加一个条件来检查我修改后的答案中给出的空文本框
    【解决方案3】:

    只需添加对空输入的检查:

    foreach (KeyValuePair<string, Book> book in library)
        {
            if (!string.IsNullOrEmpty(ISBNtext.Text) && book.Key.Contains(ISBNtext.Text) || !string.IsNullOrEmpty(TITLEtext.Text) && book.Value.Title.Contains(TITLEtext.Text))
            {
                libraryList.Items.Add(String.Format("{0} = {1}", book.Key, book.Value.Title));
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2016-10-30
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      相关资源
      最近更新 更多