Я хотел бы смочь отфильтровать поле списка, содержащее 1 000 строк, каждый 50 - 4 000 символов в длине, поскольку пользователь вводит в текстовом поле без задержки.
Я в настоящее время использую таймер, который обновляет поле списка после TextChanged
событие текстового поля не было инициировано в 300 мс. Однако это довольно судорожно, и ui иногда замораживается на мгновение.
Каков нормальный способ реализовать функциональность, подобную этому?
Править: Я использую winforms и .net2.
Спасибо
Вот является разделенный вниз версией кода, который я в настоящее время использую:
string separatedSearchString = this.filterTextBox.Text;
List<string> searchStrings = new List<string>(separatedSearchString.Split(new char[] { ';' },
StringSplitOptions.RemoveEmptyEntries));
//this is a member variable which is cleared when new data is loaded into the listbox
if (this.unfilteredItems.Count == 0)
{
foreach (IMessage line in this.logMessagesListBox.Items)
{
this.unfilteredItems.Add(line);
}
}
StringComparison comp = this.IsCaseInsensitive
? StringComparison.OrdinalIgnoreCase
: StringComparison.Ordinal;
List<IMessage> resultingFilteredItems = new List<IMessage>();
foreach (IMessage line in this.unfilteredItems)
{
string message = line.ToString();
if(searchStrings.TrueForAll(delegate(string item) { return message.IndexOf(item, comp) >= 0; }))
{
resultingFilteredItems.Add(line);
}
}
this.logMessagesListBox.BeginUpdate();
this.logMessagesListBox.Items.Clear();
this.logMessagesListBox.Items.AddRange(resultingFilteredItems.ToArray());
this.logMessagesListBox.EndUpdate();