У меня есть рекурсивный метод, который создает древовидную структуру ресурса и связанных с ним ресурсов.
Для каждого ресурса, с которым я работаю, я добавляю его в список членов класса, который проверяю на каждой итерации, чтобы убедиться, что мы не зацикливаемся на ресурсах, которые взаимозависимы.
Каждый раз, когда я вызываю этот рекурсивный метод в первый раз, мне нужно, чтобы список членов класса был чистым.
На данный момент у меня есть отдельный метод для этого, который я могу вызывать между вызовами рекурсивного метода.
Я бы хотел избавиться от этого вызова метода и автоматически сбрасывать список каждый раз.
На данный момент я вижу два варианта решения этой проблемы:
- Проверка, является ли вызывающий метод таким же, как текущий
выполнить метод и, если нет, сбросить список
- Вместо этого избавьтесь от элементов рекурсии и очереди, удалив из очереди и
ставить в очередь, как мы идем. В конце вызова метода я могу сбросить список.
Как бы вы решили эту проблему? Какой подход вы бы выбрали?
Вот как выглядит мой код:
public class GetAllRelatedResourcesByParentGuidQuery : IGetAllRelatedResourcesByParentGuidQuery
{
private readonly IList<Guid> _itemsCheckedForRelations = new List<Guid>();
public IEnumerable<IDependency> Invoke(Guid parentCiId,
IResoucesByIdQuery getResources)
{
if (!_itemsCheckedForRelations.Contains(parentCiId))
{
var relatedResources = getResources.Invoke(parentCiId);
_itemsCheckedForRelations.Add(parentCiId);
if (relatedResources.Count() > 0)
{
foreach (var relatedResource in relatedResources)
{
relatedResource.Resource.DependentResources = Invoke(
relatedResource.Resource.Id,
getResources);
yield return relatedResource;
}
}
}
}
public void ResetCheckedItemsCollection()
{
_itemsCheckedForRelations.Clear();
}
}