在C#中基于string和bool过滤对象列表

时间:2015-10-31 07:25:23

标签: c#

我正在寻找一些有关实现目标的好方法的建议。我觉得下面的伪代码是多余的,并且必须有一种更有效的方法。我的问题是这种方式还是更有效的解决方案?所以这是设置...

我有一个名为Node的类,它有两个属性

class Node
{
    bool favorite
    string name
}

我有一个包含大约一千个这些节点的列表。 我想给用户三个功能..

  1. 过滤列表以显示收藏夹的方法,否则如果收藏夹为false则会显示原始列表

  2. 能够按字符串/名称比较进行搜索

  3. 搜索和收藏夹组合使用的能力

  4. 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 个答案:

答案 0 :(得分:3)

您可以使用linq语句优化代码,以根据searchString和favorite选项进行过滤。

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查找搜索,如果您希望基于包含字符串搜索进行搜索,则可以更改为包含。