Rekurze   otázka

C#

Ahoj, mám problém s vlastní funkcí pro vyhledávání v hierarchické kokelci.

public Item GetItemByID(string ID, ItemCollection Collection)
{
    foreach(Item a in Collection)
    {
        if(a.ID == ID)
        {
            return a;
        }
        return GetItemByID(ID, a.SubItems);
    }
    return null;
}

Problém je asi patrný, ale pro úplnost:

- Kód najde vždy jen jednu položku v kolekci, jednu v podkolekci, ... ...

Je to způsobeni tím, že v cyklu bud vrátím objekt, nebo přejdu na jeho kolekci prvků. Tudíž druhý objekt v téže kolekci to už nenajde.

Dumám nad tím už dlouho, a nevím, jak to napsat lépe (funkčně).

Poradíte prosím?

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stačí si na začátku funkce inicializovat nějakou kolekci, naházet do ní nalezené prvky a vrátit tu kolekci. Samozřejmě bude potřeba přepsat kód, který funkci používá tak, že bude očekávat kolekci prvků a ne jeden prvek.

public IEnumerable<Item> GetItemByID(string ID, ItemCollection Collection)
{
  var items = new List<Item>();
  // ...
  return items;
}
nahlásit spamnahlásit spam 0 odpovědětodpovědět

To už jsem zkoušel.

Vytvořil jsem si List<Item> a do něj naházel úplně všechny prvky z celé hierarchické kolekce. Následně jsem v tomto Listu hledal položky, kde ID == "Něco" a tu vrátil.

Problém nastal, když jsem chtěl udělat například:

GetItemByID("Něco", GetAllItems()).SubItems.Add(NewItem);

* GetAllItems je právě datový typ List<Item> obsahující všechny položky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A jakou chybu to píše ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ja som sa s tým trošku hral, a skončil som s týmto:

public static IEnumerable<Item> GetItemByID(string ID, ItemCollection itemsHierarchy)
        {
            foreach (Item item in itemsHierarchy)
            {
                if (item.ID == ID)
                {
                    yield return item;
                }
                foreach(Item item2 in GetItemsByID(ID,item.SubItems))
                    yield return item2;
            }
        }

Nie je to úplne ideálny kód, ale fungovalo mi to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback