Фильтрация в реальном времени поля списка

Я хотел бы смочь отфильтровать поле списка, содержащее 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();
5
задан Ryan 4 August 2010 в 20:43
поделиться