搜索字符串内的字符串

问题描述:

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

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等待爱**如果我搜索等待爱情应该给我的项目。

+0

除了'listbox_titles.Items [i] .ToString()。ToLower()。 (txt_to_search.Text)'from'if' –

+0

@ChetanRanpariya这些是“||”运算符而不是'&&'即使它们不是必要的,它们也不会影响结果。 – Deadzone

+0

@ChetanRanpariya好男人我很好地尝试它并回来 –

您只需要找到包含您搜索内容的列表框项目,因此您不需要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()); 
       } 
      } 
+0

感谢您的帮助,但仍然给我同样的问题只检测第一个字不在中间 –

+0

更新后检查我的答案。 –

+0

其错误[link](https://imgur.com/a/nYGIb) –

确保你的代码是不喜欢你原来,当你得到它的工作,因为你总是会得到的消息框:

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

只要捕获列表,并询问它。

编辑:刚才注意到,我的扫描停止不了最后(不知道为什么,老年人的脑可能会褪色)。除非你正在寻找单个字符(这正是我碰巧做的!)