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()

理由はわかりませんが、常に親インスタンスが見つかるとは限らず、第 2 レベルから検索を開始します (ただし、これは実際の問題ではありません)。

このネストされたクラスのすべての深さから要素を見つける最良の方法は何ですか?

ありがとう

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 の代わりに親への参照を保持することをお勧めします。父親がいない場合は null にします。多くの手間を省きます。多くの。

于 2012-06-19T09:48:26.630 に答える
0

構造を調べて、親の最後の親を見つけたい場合は、次のコードを使用できます。

var group = [my Group instance];

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

これは、ID が 0 より大きく、id>0 には常に有効な親があることを前提としています。

于 2012-06-19T09:50:24.180 に答える
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 に答える