在IEnumerable集合中查找所有依赖子项的最佳方法是什么

leo*_*ora 3 c# linq collections ienumerable

我有一个包含2个表的数据库:

  1. 项目
  2. ItemDependencies

项目具有ID密钥

ItemDependencies有两列:ItemIdDependsOnItemId

我把它转换成一个集合:

 IEnumerable<Item> items = GetItems();
Run Code Online (Sandbox Code Playgroud)

每个项目都有一个:Dependencies属性,它是一个

List<Item>
Run Code Online (Sandbox Code Playgroud)

所以我想过滤初始项目列表:

  1. 给定一个项目,我想要一个该项目的列表以及递归依赖此项目的所有项目.

  2. 给定一个项目,我想要一个该项目的列表以及它所依赖的所有其他项目(也是递归的).

在C#,LINQ或其他任何可以解决这个问题的方法中,最好的方法是什么.

Mar*_*ers 5

要获取元素的所有依赖项列表,可以使用以下递归函数:

IEnumerable<Item> GetAllDependencies(Item i)
{
    IEnumerable<Item> a = new Item[] { i };
    IEnumerable<Item> b = i.Dependencies
                           .SelectMany(d => GetAllDependencies(d))
                           .Distinct();
    return a.Concat(b);
}
Run Code Online (Sandbox Code Playgroud)

此方法假定依赖关系链中没有循环(如果存在循环,它将递归调用自身,直到它抛出a StackOverflowException).

为了做到这一点,我建议构建一个新的数据结构来保存反向依赖,然后重用相同的技术.