c# - Linq 递归搜索

标签 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)”的方式调用。

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

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

让我们有一个独特的类

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 实例都有一个 parent 属性,如果它为 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");
}

关于c# - Linq 递归搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30441050/

相关文章:

Javascript递归导致循环结构

c++ - 返回错误值的 bool 递归函数

c# - 在没有物理文件的情况下创建流

c# - 如何使用 .net 创建加密文件容器

c# - 在 C# .NET 中将字符串列表转换为单引号列表

c# - 每个 ID 查找多个日期的有效方法

java - 寻找最大公共(public)子序列

c# - .NET 程序集 : understanding type visibility

c# - 在 C# 中是否有更简单的方法来执行此 if 语句

c# - Visual Studio 中的 WriteLine 就像在 LinqPad 中一样