Linq递归搜索

时间:2015-05-25 14:54:15

标签: c# linq recursion iqueryable

在我的程序中,我有一些对象,我称之为“项目”。这些项目具有父类别,这些父母可能拥有自己的类别父母。因此,要按类别父项搜索这些项目,我希望以递归方式查看每个父项,看看它们是否包含我的搜索字符串。

这些对象存储在数据库中。每个项目都有一个名称,一些其他不相关的东西,以及一个父母。数据库被制作成IQueryable列表,并调用递归方法。但是,我只是不熟悉递归才能完成这个,所以如果有人能借给我一个手,那就太好了。

这就是我所拥有的:

class node
{
    private Category parent { get; set; }

    node (Item item)
    {
        this.parent = item.Category;
    }

    node (Category category)
    {
        this.parent = category.CategoryParent;
    }
}
class CategoryParentIterator
{
    public static node Search (node currentNode, string search) 
    {
        if (currentNode == null)
        {
            return null;
        }
        //TODO: RECURSIVE PARENT SEARCH
        return currentNode; 
    }

    public static IQueryable<Item> Search (this IQueryable<Item> values, string search)
    {
        //TODO: SEARCH
    }
}

搜索将通过类似“List = List.Search(searchString)”的方式调用。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你应该重新定义你的课程。

让我们有一个独特的课程

public class Node
{
  public Node Parent { get; private set; }

  //additional properties etc...
  public string Name { get; set;}
  public int Value {get; set;}

  public Node(Node parent)
  {
    Parent = parent;
  }
}

所以现在任何Node实例都有一个父属性,如果它是null,那么就没有父级,你到达了根。

现在搜索逻辑:

public static T SearchInHierarchy<T>(T node, Func<T,bool> predicate)
{
  if(predicate) return node;
  if(node.Parent == null) return null; //null if not found
  return SearchInHierarchy(node.Parent, match);
}

这里的谓词就是你想要的搜索。 一个例子:

public static Test()
{
  var ancestor= new Node();
  var parent = new Node(ancestor);
  var child = new Node(parent);
  var result = SearchInHierarchy(child, x => x.Name == "Foo");
}