Dodawanie elementów do listy poprzez AddRange z metody rekurencyjnej

0

Witam. Jestem amatorem i mam pewien problem. Chcę dodawać elementy do listy przez wywołanie metody AddRange, w której jako argument przekazuje wywołanie metody rekurencyjnej zwracającej listę tego samego typu. Podczas debugowania po instrukcji return do listy zostają dodane elementy ale po powrocie do siebie przez funckję rekurencyjną (przekazaną jako parametr) lista od razu się zeruje. Wiem, że to co napisałem to troch masło maślane ale trudno mi to inaczej ubrać w słowa.
Mam w bazie kategorie, które zawierają albo bezpośrednio produkty (jeśli są kategoriami najbardziej szczegółowymi) albo nie zawierają bezpośrednio produktów, a zawierają numer id podkategorii, która z kolei może zawierać następne podkategorie. Po kliknięciu kategorii głównej chce wyszukać w niej kategorie najbardziej szczegółowe, a z nich wyciągnąć produkty.

 
        [ChildActionOnly]
        public ActionResult ShowProductList(int selectedCategoryId = 0)
        {
            var items = new List<Item>();
            if (selectedCategoryId != 0)
            {
                var category = db.Categories.Where(c => c.Id == selectedCategoryId).Single();
                items.AddRange(FindItemsInCategory(category));//-przekazanie wywołania metody rekurencyjnej
            }
            else
            {
                items = db.Items.ToList();
            }
            return PartialView("_ProductList", items);

        }

        public List<Item> FindItemsInCategory (Category category)
        {
            var items = new List<Item>();
            if(category.ChildCategoriesId.Count != 0)
            {
                foreach (var childId in category.ChildCategoriesId)
                {
                    FindItemsInCategory(db.Categories.Where(c => c.Id == childId.ChildId).Single());//-rekurencja
                }
            }
            else
            {
                items.AddRange(category.Items.ToList());
            }
            
            return items;
        }
 

Czemu po kazdym kolejnym powrocie rekurencyjnym lista items w akcji ShowProductList się zeruje skoro nie przypisuje wartości poprzez = tylko ją dodaje?

0

Jak wracasz z rekurencyjnego wywołania to nie powinieneś do items dodać tej zwróconej listy?

                foreach (var childId in category.ChildCategoriesId)
                {
                    FindItemsInCategory(db.Categories.Where(c => c.Id == childId.ChildId).Single());//-rekurencja
                }
0

Nie wiem czy rozumiem o czym piszesz. Ten fragment:

 foreach (var childId in category.ChildCategoriesId)
                {
                    FindItemsInCategory(db.Categories.Where(c => c.Id == childId.ChildId).Single());//-rekurencja
                }

To kolejne wywołanie metody do której jest przekazywana categoria z bazy ponieważ kategoria z poprzedniego wywołania zawierała podkategorie (nie była ostateczna) i w tym moemncie nie ma worzonej listy elementów bo ich nie ma. Lista elementów jest dodawana w bloku else jeśli kategoria nie zawiera podkategorii czyli jest ostateczna, a za nią jest return do wcześniejszej akcji.

 else
            {
                items.AddRange(category.Items.ToList());
            }
            
            return items; 

W tym momencie lista

 items.AddRange(FindItemsInCategory(category));

dostaje te elementy i są poprawne ale przy nastepny kroku (powrotu do dalszego wykonywania metody rekurencyjnej ) lista się zeruje.

1

Metoda

FindItemsInCategory 

dla każdego wywołania, gdzie parametr category spełnia warunek category.ChildCategoriesId.Count != 0

 zwraca <code class="csharp">new List<Item>();

Zamień ten fragment:

            if(category.ChildCategoriesId.Count != 0)
            {
                foreach (var childId in category.ChildCategoriesId)
                {
                    FindItemsInCategory(db.Categories.Where(c => c.Id == childId.ChildId).Single());//-rekurencja
                }
            }

Na taki:

            if(category.ChildCategoriesId.Count != 0)
            {
                foreach (var childId in category.ChildCategoriesId)
                {
                    items.AddRange(FindItemsInCategory(db.Categories.Where(c => c.Id == childId.ChildId).Single()));//-rekurencja
                }
            }
0

Zajebiście dziękuję :) Nie ma to jak walnąc babola i godzine patrzeć się w monitor ;)

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