2015-10-31 2 views
1

Я ищу несколько советов о хорошем способе достижения своей цели. Я чувствую, что мой псевдо-код ниже избыточен и что должен быть более эффективный способ сделать это. Мой вопрос заключается в том, чтобы улучшить этот или более эффективный способ? Так вот установка ...Фильтрация списка объектов на основе строки и bool в C#

У меня есть класс с именем узла, который имеет два свойства

class Node 
{ 
    bool favorite 
    string name 
} 

У меня есть список, который содержит около тысячи этих узлов. Я хочу, чтобы дать пользователям три функции ..

  1. Способ фильтрации списка, чтобы просто показать избранные в противном случае, если избранные ложна отображает первоначальный список

  2. Возможность поиска по строке/сравнение имя

  3. способность как поиск и любимой работы в сочетании

enter image description here

ниже - мой псевдокод - описывает подход, но не идеальный. Вы можете прочитать комментарии в коде, чтобы получить главный смысл.

// initial collection of nodes 
list<Nodes> initialnodesList = []; 
// list of nodes which are displayed in UI 
list<Nodes> displayNodes = []; 

public void FilterNodes() 
{ 
    list<Nodes> tempNodesList = []; 

    if (favoritesEnabled) 
    { 
     // collect favorites 
     foreach (n in initialnodesList) 
      if (n.favorite) 
       tempNodesList.add(n); 

     // search within favorites if needed and create new list 
     list<Nodes> searchedNodesList = []; 
     if (!isStringNullWhiteSpace(searchString)) 
     { 
      foreach (n in tempNodesList) 
       if (n.name == searchString) 
        searchedNodesList.add(n); 

      displayNodes = searchedNodesList; 
      return; 
     }else{ 
      return; 
     } 
    } 
    else 
    { 
     // search within initial node collection if needed and create new list 
     list<Nodes> searchedNodesList = []; 
     if (!isStringNullWhiteSpace(searchString)) 
     { 
      foreach (n in initialnodesList) 
       if (n.name == searchString) 
        searchedNodesList.add(n); 

      displayNodes = searchedNodesList; 
      return; 
     } 

     // if search is not needed and favorites were not enabled then just return the original node collection 
     displayNodes = initialnodesList; 
     return; 
    } 

} 
+1

Что именно эта цель? Вы хотите закодировать его на C# и сделать код более чистым? Если это так, вы должны взглянуть на 'Linq', особенно' IEnumerable.Where' – Domysee

ответ

3

Вы можете оптимизировать свой код с помощью оператора linq для фильтрации на основе searchString и любимого варианта.

public List<Node> FilterNodes(bool seachFavorite, string searchString) 
{ 
    return initialnodesList.Where(l => (string.IsNullOrEmpty(searchString) || l.name.StartWith(searchString, StringComparison.OrdinalIgnoreCase)) && l.favorite == seachFavorite).ToList(); 
} 

Кроме того, оптимизация кода для поиска поиска с StartWith, вы можете изменить на Содержит если вы хотите найти должно быть сделано на основе содержит строку поиска.

+0

Не будет ли это всегда искать любимую и строку. В некоторых случаях вы можете использовать только тот или иной. – JokerMartini

+0

Обновлен оператор 'linq', чтобы он выполнял поиск в списке строки поиска, не является нулевым или пустым, а любимый - как истинный. Итак, если вам нужно искать только любимую, то передайте searchString как «Null» и searchFavorite как «true» в методе FitlerNodes. – user1672994

Смежные вопросы