在字符串中搜索字符串

search string inside string

我正在开发需要搜索方法的应用程序我有一个充满项目的列表框,每个项目都有歌手姓名和歌曲名称,我需要能够以我尝试过的相同方法搜索歌曲名称或歌手名称所以远:

 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 waiting for love ** 如果我搜索 waiting for love 是我想要什么的这个例子应该给我项目。

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

  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());
                }
            }

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

        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;
    }
}

只需捕获列表并进行查询即可。

编辑:刚刚注意到我的扫描未结束就停止了(不知道为什么,老年大脑可能会衰退)。除非您正在搜索单个字符(这正是我碰巧做的!)

,否则它可能不会产生重大影响