0

Generic を開いた状態でオブジェクトの階層をフラット化したいT

このリンク再帰リストの平坦化

渡された IEnumerable を使用してそれを行う方法を示します。しかし、渡されたオブジェクト T をフラット化し、

そのプロパティ Children を一般的かつ再帰的に。

U1.Children(U2,U3,U4)
U2.Children(U9,U10)
U3.Children(U11,U12)
U4.Children(U20,U30)

メソッド (選択したノード) に渡し、次のU1フラット リストを取得します。

U1,U2,U3,U4,U9,U10,U11,U12,U20,U30

それはどういうわけか一般的な方法で可能ですか?

4

2 に答える 2

2

子を取得するための関数を受け入れる再帰的な拡張メソッドを定義できます。

public static IEnumerable<T> Flatten<T>(this T root, Func<T, IEnumerable<T>> getChildren)
{
    IEnumerable<T> rootSingleton = new T[] { root };
    IEnumerable<T> children = getChildren(root);
    IEnumerable<T> descendants = children.SelectMany(child => Flatten(child, getChildren));
    return rootSingleton.Concat(descendants);
}

次に、次のように消費できます。

var flat = u1.Flatten(u => u.Children);
于 2012-02-13T20:15:25.377 に答える
0

階層が 1 レベルの深さしかない場合は、select many と union を使用できます

public IEnumerable<T> Flattern<T>(IEnumerable<T> input) where T : ISomeinterface {
    return input.SelectMany(t=> t.Children).Union(input)
}

Childrenこのコードは、プロパティを持つ基本クラスまたはインターフェイスで制約しない限り、コンパイルされません。コンパイラは、オブジェクトがそのプロパティを持っていることを認識している必要がありますl

于 2012-02-13T20:11:29.717 に答える