循環依存関係を持つ可能性のあるアイテムを再帰するより良い方法を探しています。現在、再度処理しないようにするために、既に処理された項目のリストを渡していますが、これはおそらく最善の方法ではありません。
これが私が現在行っていることです:
/// <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
が、基本的に、「アイテム」が循環依存関係が発生する可能性のある「アイテム」のリストを保持する場合は常にこれを適用する必要があります。辞書を使用すると、同じ計算を複数回実行するのを回避できます。それは必須ではありません。また、必要なインスタンスは 1 つだけTCObjectComparer
ですが、これも必須ではありません。助言がありますか?これを処理するための古典的なアルゴリズムが存在するに違いないと思いますが、見つかりません。