Фильтрация коллекции ObservableCollection по пользовательскому вводу - PullRequest
6 голосов
/ 22 сентября 2009

У меня есть ObservableCollection около 1000 объектов, которые должен быть отфильтрован (найден) конечным пользователем. Пользователь должен иметь возможность осуществлять поиск по имени или идентификатору сотрудника. Элемент управления List использует FilteredEmployees, а сотрудники загружены всем, что загружается на странице.

У меня сейчас настроено так:

public ObservableCollection<EmployeeServicesData> Employees { get; set; }
public ObservableCollection<EmployeeServicesData> FilteredEmployees { get; set; }

internal void FilterEmployee(string searchText, bool isByName)
{
    if (searchText.Length > 0)
    {
        IEnumerabe<EmployeeServicesData> filter;

        if (isByName)
            filter = Employees.Where(x => x.Name.Length >= searchText.Length).Where(x => x.Name.Substring(0, searchText.Length) == searchText.ToUpper());
        else
            filter = Employees.Where(x => x.EmployeeNumber.ToString().Length > searchText.Length).Where(x => x.EmployeeNumber.ToString().Substring(0, searchText.Length) == text);

        foreach (EmployeeServicesData employee in filter)
            FilteredEmployees.Add(employee);
    }
}

Санитария обрабатывается до этого метода.

Это не пахнет очень эффективно. Должен ли я использовать два метода для этого, или есть лучший способ обработки фильтрации?

Я бы хотел сохранить Сотрудников в неизменном состоянии, чтобы я мог снова заполнить FilteredEmployees до полного списка без повторного обращения к БД.

Ответы [ 4 ]

2 голосов
/ 13 октября 2010

Я знаю, что это старый пост, но я использовал его, чтобы помочь мне с аспектом фильтрации, и заметил, что SlipFish создавал ObservableCollection путем зацикливания коллекции IEnumerable.

Поскольку конструктор ObservableCollection принимает коллекцию IEnumerable, коллекция ObservableCollection может быть создана следующим образом:

FilteredEmployees = new ObservableCollection<EmployeeServicesData>(filter);
1 голос
/ 04 ноября 2010

Посмотрите на этот пост для отфильтрованной наблюдаемой коллекции.

1 голос
/ 22 сентября 2009

Похоже, вы пытаетесь увидеть, содержится ли searchText в имени сотрудника или в номере сотрудника.

Вы можете сделать это вместо:

x.Name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0
x.EmployeeNumber.ToString().IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0

Или вы можете использовать StartsWith вместо IndexOf.

Редактировать. Другая проблема, связанная с элементами управления списками с большими объемами данных, заключается в том, что визуализация занимает много времени. Так что, если у вас нефильтровано, когда вы запускаете Silverlight или WCF или что-то еще, чтобы передать все 1000 в элемент управления, даже если вы не видите их все, это может занять немного времени. Silverlight 3 имеет Виртуализация пользовательского интерфейса , что, вероятно, будет лучшей оптимизацией, которую вы могли бы здесь сделать.

0 голосов
/ 21 июня 2011

Вы можете сделать это через PagedCollectionView.

Посмотрите этот пост в блоге для примера: http://blogs.msdn.com/b/avip/archive/2009/10/30/real-time-list-filtering-with-silverlight-mvvm-and-pagedcollectionview.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...