在字符串中搜索字符串
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;
}
}
只需捕获列表并进行查询即可。
编辑:刚刚注意到我的扫描未结束就停止了(不知道为什么,老年大脑可能会衰退)。除非您正在搜索单个字符(这正是我碰巧做的!)
,否则它可能不会产生重大影响
我正在开发需要搜索方法的应用程序我有一个充满项目的列表框,每个项目都有歌手姓名和歌曲名称,我需要能够以我尝试过的相同方法搜索歌曲名称或歌手名称所以远:
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;
}
}
只需捕获列表并进行查询即可。
编辑:刚刚注意到我的扫描未结束就停止了(不知道为什么,老年大脑可能会衰退)。除非您正在搜索单个字符(这正是我碰巧做的!)
,否则它可能不会产生重大影响