Я ищу лучший способ рекурсии элементов, которые могут иметь циклические зависимости. В настоящее время я передаю список уже обработанных элементов, чтобы не обрабатывать их снова, но это, вероятно, не лучший способ сделать это.Как перезаписать элементы, имеющие циклические зависимости
Вот что я сейчас делаю:
/// <summary>
/// caching dependencies in order to increase performance
/// </summary>
private static readonly IDictionary<string, IEnumerable<OwnedItem>> dependencies
= new Dictionary<string, IEnumerable<OwnedItem>>();
/// <summary>
/// recursively find OwnedItem this oi depends upon
/// in order to correctly handle cyclic dependencies, already considered
/// dependencies need to be supplied as well (can be null or empty)
/// </summary>
/// <param name="oi"></param>
/// <param name="parentDeps"></param>
/// <returns></returns>
private static IEnumerable<OwnedItem> GetDependencies(
OwnedItem oi,
IEnumerable<OwnedItem> parentDeps)
{
if (null == oi)
{
return Enumerable.Empty<OwnedItem>();
}
if (dependencies.ContainsKey(oi.UniqueId))
{
return dependencies[oi.UniqueId];
}
var comparer = new TCObjectComparer<OwnedItem>();
var result = new HashSet<OwnedItem>(comparer);
result.Add(oi);
result.UnionWith(parentDeps ?? Enumerable.Empty<OwnedItem>());
foreach (var oi2 in oi.AllUsedOwnedItemsToBeIncluded.Except(
result, comparer))
{
result.UnionWith(GetDependencies(oi2, result));
}
dependencies[oi.UniqueId] = result;
return result;
}
элементы находятся типа «OwnedItem» и сохранить список (IEnumerable<OwnedItem>
) своих прямых зависимостей в собственности AllUsedOwnedItemsToBeIncluded
, но в основном это должен применяться всякий раз, когда «элементы» сохраняют список «элементов», где могут возникать циклические зависимости. Использование словаря просто позволяет избежать одного и того же вычисления более одного раза; это не существенно. Кроме того, необходим только один экземпляр TCObjectComparer
, но это также не является существенным. Любые предложения? Я думаю, что для этого должен существовать какой-то классический алгоритм, но я не могу его найти.
Не могли бы вы отформатировать образец кода, его очень трудно прочитать. –
У вас есть правильная идея, насколько я вижу из описания. Но код трудно понять, я не знаю, правильно ли вы это делаете. – weston
Было бы здорово, если бы вы разместили [mcve]. Я хотел бы иметь возможность копировать и запускать ваш код. Прямо сейчас нет определений для 'OwnedItem' и' TCObjectComparer'. И нет данных образца и ожидаемого вывода. – Enigmativity