0

我需要通过 linq 深入查看嵌套集合的节点。

这是嵌套类:

public class Group
{

    public int Id { get; set; }

    public string Description { get; set; }

    public int ParentId { get; set; }

    public List<Group> Groups { get; set; }

}

此类的每个实例都可以在 Groups 方法中具有多个实例,依此类推。每个实例都通过 ParentId 属性链接。

我需要,有一个 Group 类的实例,检索他的父亲。我试过这个:

var parent = _repositoryGroups
.Where(g => g.Id == [my Group instance].ParentId)
.SelectMany(g => g.Groups)
.FirstOrDefault()

我不知道为什么,但它并不总是找到父亲实例并且它从第二级开始查找(但这不是一个真正的问题)。

在这个嵌套类的所有深处找到元素的最佳方法是什么?

谢谢

4

3 回答 3

2

现在听起来你想递归地获取某个组的所有孩子。

所以你可以拥有:

private IEnumerable<Group> EnumerateChildren(Group parent)
{
    if (parent.Groups != null)
    {
        foreach (var g in parent.Groups)
        {
            yield return g;

            foreach (var sub in EnumerateChildren(g))
            {
                yield return sub;
            }
        }
    }
}

如果您只想获取某个组的父级:

private Group GetParent(Group child)
{
    _repositoryGroups.Where(g => g.Id == child.ParentId).FirstOrDefault();
}

如果您需要获取某个组的超级父级(...的父级的父级的父级):

private Group GetSuperParent(Group child)
{
    parent = GetParent(child);

    while (parent != null)
    {
        child = parent;
        parent = GetParent(child);
    }

    return child;
}

最重要的是,我建议如果你能做到这一点,请保留对父级的引用而不是它的 Id。如果它没有父亲,就让它为空。省去了很多麻烦。很多。

于 2012-06-19T09:48:26.630 回答
0

对不起,伙计们,也许我没有很好地解释我的问题。我开发了这个解决方案,启发了你的答案:

private static Group GetGroupFather(IEnumerable<Group> groups, Group child)

{

    foreach (var group in groups)
{

    // try to nested search
    var result = GetGroupFather(group.Groups, child);

    if (result != null) return result;

    // check in the current level
    if (group.Id == child.ParentId)

        return group;

}

return null;

}

如果您使用 linq 有更好的解决方案,请告诉我。

于 2012-06-19T10:26:16.377 回答
0

如果你想上去你的结构并找到父母的最后一个父母,你可以使用这段代码:

var group = [my Group instance];

while(group.ParentId > 0)
{
    group = _repositoryGroups.First(g => g.Id == group.ParentId);
}

这假设您的 ID 大于零,并且 id>0 将始终具有有效的父级。

于 2012-06-19T09:50:24.180 回答