关于实体框架:C#中的递归树遍历问题

Issue with recursive tree traversal in c#

我具有以下格式的树结构数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
H1    
    H1 - 1
        H1 - 1 - 1
            H1 - 1 - 1 - 1
                H1 - 1 - 1 - 1 -1
                    H1 - 1 - 1 - 1 -1 - 1
        H1 - 1 - 2
        H1 - 1 - 3
    H1 - 2
        H1 - 2 - 1
        H1 - 2 - 2

H2    
H3    
    H3 - 1
        H3 - 1 - 1
            H3 - 1 - 1 - 1
                H3 - 1 - 1 - 1 - 1
            H3 - 1 - 1 - 2
        H3 - 1 - 2
        H3 - 1 - 3
    H3 - 2

我必须通过传递子项的ID来检查上述树中是否存在某项,因此我需要遍历上述树中的每一项。到目前为止,我已经编写了以下递归方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public bool CheckIfChildItemExists(Item parentItem, long childItemId)
{
    var isChildExisting = false;
    foreach (Item item in parentItem.Children)
    {
        if (item == context.Items.Where(x => x.ItemID == childItemId && x.IsActive).FirstOrDefault() || item.Children.Contains(context.Items.Where(x => x.ItemID == childItemId && x.IsActive).FirstOrDefault()))
        {
            isChildExisting = true;
            return isChildExisting;
        }
        else
        {
            return CheckIfChildItemExists(item, childItemId);
        }
    }
    return isChildExisting;
}

使用上述方法:

  • 根项目H1, H2, H3是可访问的。
  • 可以访问H1的所有分支(H1 -1H1 - 1 - 1H1 - 1 - 1 -1等)。
  • H1 - 2 - 1H1 - 2 - 2是不可访问的,它们没有被遍历。但是可以访问其父项H1 - 2
  • H3的所有子项均不可访问。

我的方法在做什么错?


您要早点回来。实际上,您要做的是从根到叶最多签入一个分支,但是您从不签到其他分支。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public bool CheckIfChildItemExists(Item parentItem, long childItemId)
{
    foreach (Item item in parentItem.Children)
    {
        if (item == context.Items.Where(x => x.ItemID == childItemId && x.IsActive).FirstOrDefault() || item.Children.Contains(context.Items.Where(x => x.ItemID == childItemId && x.IsActive).FirstOrDefault()))
        {
            return true;
        }
        else
        {
            var childItemExists = CheckIfChildItemExists(item, childItemId);
            if(childItemExists) return true; // else continue search in other children
        }
    }
    return isChildExisting;
}

我不确定您在if语句中的状态是否正确。如果您的所有商品均符合搜索条件,则可以尝试使用代码。您应该对每个根项目都运行此过程,或者让人造根项目传递给该函数。

1
2
3
4
5
6
7
8
9
10
public bool CheckIfChildItemExists(Item parentItem, long childItemId)
{
    if(parentItem.ItemID == childItemId && parentItem.IsActive) return true;
    foreach (Item item in parentItem.Children)
    {
        var childItemExists = CheckIfChildItemExists(item, childItemId);
        if(childItemExists) return true; // else continue search in
    }
    return false;
}

item == context.Items.Where(x => x.ItemID == childItemId && x.IsActive).FirstOrDefault()中,您实际上是在比较两个对象,为什么不只检查item对象的条件?此外,您可以改用context.Items.FirstOrDefault(x => x.ItemID == childItemId && x.IsActive)