Pour tous les enfants:
public IEnumerable<long> GetChildren(List<Channel> list, long id)
{
foreach(Channel c in list)
if(c.parentID == id)
yield return c.ID;
}
construire ce que le retour d'un IEnumerable<long>
plutôt que de retourner un code qu'appeler alors List<long>
qui a besoin d'un List<long>
peut utiliser new List<long>(GetChildren(list, id))
ou GetChildren(list, id).ToList()
, tout en appelant le code qui n'a pas besoin cela peut obtenir de meilleures performances en mémoire et en temps de premier résultat en ne construisant pas une liste dont il n'a pas réellement besoin, comme dans foreach(long childID in GetChildren(list, id))
.
Pour obtenir tous les descendants (enfants, petits-enfants, arrière-petits-enfants, etc.), qui est le seul cas que nous pourrions faire usage de récursion (selon le titre de votre question) utilisez:
En supposant qu'il ne peut y avoir des doublons (même petits-enfants à travers de multiples routes):
private IEnumerable<long> GetDescendants(List<Channel> list, long id)
{
foreach(long child in GetChildren(list, id))
{
yield return child;
foreach(long grandchild in GetDescendants(list, child))
yield return grandchild;
}
}
S'il peut y avoir des doublons vous pourriez alors appliquer .Distinct()
à ce qui précède, ou rendez-vous pour:
private IEnumerable<long> GetDescHelper(List<Channel> list, long id, HashSet<long> already)
{
foreach(long child in GetChildren(list, id))
if(already.Add(child))
{
yield return child;
foreach(long desc in GetDescHelper(list, child, already))
yield return desc;
}
}
public IEnumerable<long> GetDescendants(List<Channel> list, long id)
{
return GetDescHelper(list, id, new HashSet<long>());
}
Cela dit, je préférerais probablement modéliser cela en faisant en sorte que les classes de canaux maintiennent un List<Channel>
d'enfants.
Et voulez-vous aussi les enfants des enfants? Veuillez ajouter un autre niveau aux données d'échantillon et lister la sortie désirée. –
L'ID 28 est répété, est-ce une erreur? –
Ne serait-il pas plus simple de faire fonctionner ceci si le 'Channel' avait un' List Children {get; ensemble privé; } '? –
Oliver