1

クラスがあります

    public class Foo
    {
       public IList<Foo> Items { get; set; }
    }

    public class FooList
    {
       public IList<Foo> Items { get; set; }
    }

階層ではなく、1 つのリストですべての Foo オブジェクトを取得できるようにしたいと考えています。

私が試してみました

    IEnumerable<Foo> result = Items.SelectMany(f =>  f.Items);

しかし、これはその特定のオブジェクトのアイテムを取得するだけです。すべての子オブジェクトのすべてのアイテムを取得するわけではありません。

私も試しました

    IEnumerable<Foo> result = Items.SelectMany(t => t)

しかし、私はエラーが発生します:

メソッド 'System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable, System.Func>)' の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。

4

2 に答える 2

0

より一般的なケースで使用できる "flatten-this-tree" LINQ のような関数を組み合わせるのはかなり簡単です。

public static IEnumerable<T> Flatten<T>(
    this IEnumerable<T> source,
    Func<T, IEnumerable<T>> childSelector)
{
    HashSet<T> added = new HashSet<T>();
    Queue<T> queue = new Queue<T>();
    foreach(T t in source)
        if (added.Add(t))
            queue.Enqueue(t);
    while (queue.Count > 0)
    {
        T current = queue.Dequeue();
        yield return current;
        if (current != null)
        {
            IEnumerable<T> children = childSelector(current);
            if (children != null)
                foreach(T t in childSelector(current))
                    if (added.Add(t))
                        queue.Enqueue(t);
        }
    }
}

次に、 がある場合は、FooList使用できます

var allFoos = myFooList.Items.Flatten(foo => foo.Items);

リスト内のすべてFooの を、そのすべての子とすべて子と...

于 2012-10-19T09:33:16.483 に答える
0

FooListと呼ばれるインスタンスがあると仮定しますfooList:

FooListクラスで次のようなメソッドを定義する必要があります。

public IEnumerable<Foo> GetRecursiveFoos()
{
    return Items.Concat(Items.SelectMany(x => x.Items));
}

そして電話する

IEnumerable<Foo> result = fooList.GetRecursiveFoos();
于 2012-10-19T09:26:50.510 に答える