在字符串内搜索字符串

时间:2017-09-23 11:29:31

标签: c# string listbox listboxitem

我正在处理需要搜索方法的应用程序我有列表框已满的项目每个项目都有歌手名称和歌曲标题,我需要能够以相同的方法搜索歌曲标题或歌手名称,这是我到目前为止所尝试的:

 public void search_song()
    {

        for (int i = listbox_titles.Items.Count - 1; i >= 0; i--)
        {
            int char_count = listbox_titles.Items[i].ToString().Length;
            if (listbox_titles.Items[i].ToString().ToLower().Contains(txt_to_search.Text) || listbox_titles.Items[i].ToString().StartsWith(txt_to_search.Text, StringComparison.Ordinal) || listbox_titles.Items[i].ToString().ToLower().Substring(0, char_count).Contains(txt_to_search.Text)) ;
            {
                //listbox_titles.SetSelected(i, true);
                MessageBox.Show(listbox_titles.Items[i].ToString());
            }
        }

它的工作,但只从项目的开头搜索而不是中间 任何想法??

这个例子我想要什么,如果项目是** avicii等待爱**如果我搜索等待爱情应该给我项目。

2 个答案:

答案 0 :(得分:0)

您只需找到包含搜索内容的列表框项,因此您不需要StartsWith方法,但由于您说您的搜索方法仅适用于起始字符串,我可以发现您没有像StartsWith那样将文字转换为Contains中的较低版本,这可能是导致问题的原因。因此,如果您的支票不区分大小写,则可以使用以下内容:

  public void search_song()
        {

            for (int i = listbox_titles.Items.Count - 1; i >= 0; i--)
            {
                int char_count = listbox_titles.Items[i].ToString().Length;
                if (listbox_titles.Items[i].ToString().IndexOf(txt_to_search.Text, StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    //listbox_titles.SetSelected(i, true);
                    MessageBox.Show(listbox_titles.Items[i].ToString());
                }
            }

答案 1 :(得分:0)

确保您的代码与原始代码不同,因为您始终会收到消息框:

        if (listbox_titles.Items[i].ToString().ToLower().Contains(txt_to_search.Text) || 
listbox_titles.Items[i].ToString().StartsWith(txt_to_search.Text, StringComparison.Ordinal) ||
 listbox_titles.Items[i].ToString().ToLower().Substring(0, char_count).Contains(txt_to_search.Text)
) ;

        {
            //listbox_titles.SetSelected(i, true);
            MessageBox.Show(listbox_titles.Items[i].ToString());
        }

语法高亮显示器上的绿色波形指示警告它是一个空语句 - 在if的末尾有一个分号,所以你的代码块根本不是条件的。

编辑:

    public void search_song(string txt_to_search)
    {

        foreach(var t in listbox_titles.Items)
        {
            String s = t.ToString().ToLower();
            if(s.Contains(txt_to_search.ToLower()))
            {
                //listbox_titles.SetSelected(i, true);
                MessageBox.Show(s);
            }
        }

    }

这对我有用,因为它可以将行的大小降低到可管理的水平 - 显然,你需要使用变量而不是foreach进行索引。

编辑:

如果您需要知道出现的位置,您可以随时定义扩展助手:

    public void search_song(string txt_to_search)
    {

        foreach (var t in listbox_titles.Items)
        {

            if(txt_to_search.Occurrences(t.ToString(), false).Count > 0)
                MessageBox.Show(t.ToString());
        }

    }

}
static class StringHelpers
{
    public static List<int> Occurrences(this string pattern, string source, bool caseSensitive = true)
    {
        List<int> occurs = new List<int>();
        if (String.IsNullOrEmpty(pattern) || String.IsNullOrWhiteSpace(pattern))
            return occurs;

        int index = 0;
        if (!caseSensitive)
        {
            pattern = pattern.ToLower();
            source = source.ToLower();
        }
        while (index < source.Length) // was (index < source.Length - 1)
        {
            if ((index = source.IndexOf(pattern, index)) < 0)
                break;

            occurs.Add(index);
            ++index;
        }

        return occurs;
    }
}

抓住列表并查询它。

编辑:刚刚注意到我的扫描停止了结束(不知道为什么,老年人大脑可能会褪色)。除非你在搜索单个字符(这就是我碰巧做的事情!),否则它可能不会产生重大影响。