c# -从用户输入搜索子字符串

本文关键字:搜索 字符串 输入 用户 | 更新日期: 2023-09-27 18:16:14

我想添加一个搜索功能到我的应用程序,我已经看到了许多例子,但是,所有的数据都是由程序员添加的。我如何实现一个搜索函数,其中参数/值不是预定义的。我猜我必须创建List<>的另一个实例,因为我已经使用了一个?

        public Form1()
    {
        InitializeComponent();
    }
    List<Book> books = new List<Book>();

    private void Form1_Load(object sender, EventArgs e)
    {
    }
    //Settng Values
    public void button1_Click(object sender, EventArgs e)
    {
        Book b = new Book();
        b.Title = textBox1.Text;
        b.ISBN = textBox2.Text;
        b.Onloan = trueCheckBox.Checked;
        listView1.Items.Add(b.Title + ", " + b.ISBN + ", " + b.Onloan);
        books.Add(b);
        textBox1.Text = null;
        textBox2.Text = null;
    }
    //Method to check if item is aviable or note - boolean type
    void avaiable()
    {
        if (trueCheckBox.Checked = true)
        {

            bool onloan = true;
        }
        else
        {
            bool onloan = false;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Remove();
    }
    //Remove item from both the List & Listview
    void Remove()
    {
        try
        {
            listView1.Items.Remove(listView1.SelectedItems[0]);
            books.RemoveAt(listView1.SelectedItems[0].Index);
        }
        catch
        {
        }
    }

    //Display  information within their field when selected an item is selected
    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count == 0)
        {
            return;
        }
        else
        {

            textBox1.Text = books[listView1.SelectedItems[0].Index].Title;
            textBox2.Text = books[listView1.SelectedItems[0].Index].ISBN;
            trueCheckBox.Checked = books[listView1.SelectedItems[0].Index].Onloan;
        }
    }

    //Update the values without having to re-add
    private void button3_Click(object sender, EventArgs e)
    {
        if (listView1.SelectedItems.Count == 0)
        {
            return;
        }
        else
        {
            books[listView1.SelectedItems[0].Index].Title = textBox1.Text;
            books[listView1.SelectedItems[0].Index].ISBN = textBox2.Text;
            books[listView1.SelectedItems[0].Index].Onloan = trueCheckBox.Checked;
            listView1.SelectedItems[0].Text = textBox1.Text + ", " + textBox2.Text + ", "+ trueCheckBox.Checked;
        }
    }
    private void searchBox_TextChanged(object sender, EventArgs e)
    {
        //Here's where I am stuck, I've added a textField and labelled it search box
    }
}

//Class - set & get methods
class Book
{
    public string isbn;
    public string title;
    private Boolean onloan;

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

}

谢谢。

编辑-

本质上,搜索函数应该允许用户只使用子字符串,即:"火星"应该返回一本标题为"来自火星的程序员"的书<(举个例子)。我猜我必须使用。contains方法?

c# -从用户输入搜索子字符串

正确,您将需要使用"Contains"方法。请注意,"Contains"是区分大小写的,因此您需要考虑到这一点。

所以你会有这样的东西:

var textToSearch = searchBox.Text.ToLower();
var foundBooks = books.Where(book => book.Title.ToLower().Contains(textToSearch)).ToList();

假设books是要搜索的图书列表:

List<Book> searchResult = books.Where(b => b.Title.Contains(searchTerm)).ToList();

这将返回一个图书列表,其中的输入字符串可以在标题中找到。您可以与b.Title == searchTerm进行精确匹配,并与Book的其他性质相似。

上面的语法是LINQ,一开始可能会有点混乱,但对于这样的事情非常有效。

编辑:

要使用它,你需要using System.Linq;

因为你的搜索似乎是在TextChanged上,你想把这段代码在你的searchBox_TextChanged()方法:

获取用户输入的文本框:

TextBox searchTerm = sender as TextBox;

这将根据当前搜索来过滤图书列表:

List<Book> searchResult = books.Where(b => b.Title.Contains(searchTerm.Text)).ToList();

请注意,在另一个答案中,您可能需要执行ToLower()(或upper)以使搜索不区分大小写。

现在要做的就是将过滤后的结果searchResult显示给用户。

设法做到了,这是我的代码,它的工作原理。如果有人想使用它作为将来的参考,它在这里。

        private void button4_Click(object sender, EventArgs e)
    {
        listView1.SelectedItems.Clear();
        for (int  i = listView1.Items.Count -1; i >= 0; i--)
        {
            if (listView1.Items[i].ToString().ToLower().Contains(searchBox.Text.ToLower())) {
                listView1.Items[i].Selected = true;
            }
        }