yield return - zwrócenie podtablicy z wykorzystaniem yield

0

Cześć,
mam klasę typu Tree<T>, która w uproszczeniu wygląda tak:

public class Tree<T> {
    public List<Tree<T>> Children = new();

    public IEnumerable<Tree<T>> GetTreeList()
        {
        yield return this;

        for(var i = 0; i < Children.Count; i++)
            {
            yield return Children[i];
            yield return Children[i].GetTreeList();     //<--To nie działa
            }
        }
    }

Mam problem z utworzeniem funkcji, która zwróci mi tablicę całego drzewa. yield chyba wymaga pojedynczego obiektu i wykłada się przy rekurencyjnym wywołaniu tej samej funkcji (która zwraca listę).
Macie jakiś pomysł jak to można obejść wykorzystując yield? Bez yielda sobie poradzę, ale chciałem porównać oba rozwiązania.

0
Patryk27 napisał(a):

Brzmi jak https://stackoverflow.com/questions/2055927/ienumerable-and-recursion-using-yield-return.

To chyba nie do końca jest analogiczny problem. W moim problemie mamy do czynienia z funkcją rekurencyjną, która może mieć dowolną liczbę zagnieżdżeń. Natomiast w tym linku problem został rozwiązany przez usunięcie rekurencji (usunięcie ponownego wywołania tej samej funkcji) i wywołanie pętli na tablicy poziom niżej. Tak więc, gdyby drzewko miało 4 poziomy to u mnie zostałyby zwrócone tylko 2 poziomy.
Bez yield-a rozwiązaniem jest coś takiego:

public void GetTreeList(List<Tree<T>> tree_list)
    {
    tree_list.Add(this);
    for(var i=0; i<Children.Count; ++i)
        {
        Children[i].GetTreeList(tree_list);
        }
    }

albo coś takiego:

public List<Tree<T>> GetTreeList()
    {
    var list = new List<Tree<T>>();
    list.Add(this);
    for(var i = 0; i < Children.Count; i++)
        {
        list.AddRange(Children[i].GetTreeList());
        }
    return list;
    }
2

Natomiast w tym linku problem został rozwiązany przez usunięcie rekurencji

Hm, w jaki sposób została tam rekurencja usunięta?

0
Patryk27 napisał(a):

Natomiast w tym linku problem został rozwiązany przez usunięcie rekurencji

Hm, w jaki sposób została tam rekurencja usunięta?

Auć, nie została :D
Dziękować! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1