c# - 在Visual C#中从列表框中搜索和过滤结果
问题描述
我只是在学习如何在 c# 中编写代码,并且试图找出一种方法来从包含数据的列表框中搜索和过滤掉结果。现在我有一个列表框和一个搜索按钮,我的列表框包含网站历史记录,我的搜索按钮在列表中找到该项目,但我找不到过滤掉其他项目的方法,因此只有我在文本框中搜索的内容出现在列表框中。现在我的搜索按钮看起来像这样。有任何想法吗?
private void searchBtn_Click(object sender, EventArgs e)
{
listBoxHist.SelectedItems.Clear();
for (int i = 0; i < listBoxHist.Items.Count; i++)
{
if (listBoxHist.Items[i].ToString().Contains(textboxSearch.Text))
{
listBoxHist.SetSelected(i, true);
}
}
}
解决方案
有一个众所周知的“技巧”可以在迭代集合时删除项目。您应该使用 for...循环向后迭代(从最后一项到第一项)。
这样,当您删除一个项目时,您不会影响用于退出循环的条件,并且您可以保证每个项目都被评估。
private void searchBtn_Click(object sender, EventArgs e)
{
for (int i = listBoxHist.Items.Count - 1; i >= 0; i--)
{
if (listBoxHist.Items[i].ToString().Contains(textboxSearch.Text))
listBoxHist.SetSelected(i, true);
else
listBoxHist.Items.RemoveAt(i);
}
}
如果您在向前循环时执行此代码,您将无法正确评估每个项目。假设您在索引为 3 时删除了一个项目。位置 4 的项目会发生什么?它向下滑动了一个位置,现在它占据了位置 3,之后的所有其他项目都会发生这种情况。现在,您的循环会将索引增加到 4,并将开始评估在调用 RemoveAt 之前位于位置 5 的项目。您已跳过对项目的评估。
推荐阅读
- python - 绘制堆栈中的能级,相互叠加
- flutter - 如何使 TabBar 在 SliverAppBar 中不动?
- html - 在 JSF textArea 中保留标签 (\t)
- java - 如何通过添加周来更改 LocalDate 的年份?
- .net - 如何使用“.Net FrameWork 4.7”项目在 Azure DevOps Pipeline 上创建 Coverlet 覆盖率报告?
- c++ - 读写函数在 C++ 文件处理中是如何工作的?
- github - 有谁知道为什么我的 Git 提交有与之关联的双图标?
- oracle-sqldeveloper - 有没有一种简单的方法可以在 SQL Developer 中搜索片段?
- python - 在父类中使用重载方法
- function - 节点不和谐 js 导出一个函数