Существует хорошо известный трюк для удаления элементов при переборе по коллекции.Вы должны выполнять итерацию в обратном направлении (от последнего элемента до первого), используя цикл 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 и начнет оценивать элемент, который находился в позиции 5 перед вызовом RemoveAt.Вы пропустили оценку предмета.