1

メイン フォルダー内にあるファイルを別の場所に転送するアプリがあるとします。

たとえば、ユーザーは次のようにアプリを構成できます。

If placed in C:\X\A Transfer to C:\Z\A
If placed in C:\Y\B Transfer to C:\Z\B
. . .
. . .

今のところ、すべて順調です。ただし、次の構成では無限の転送ループが作成されます。

if placed in C:\X\A Transfer to C:\Z\A
if placed in C:\Z\A Transfer to C:\Z\B
if placed in C:\Z\B Transfer to C:\X\A

このような階層は非常に複雑になる可能性があります。それらを予測し、そもそもそのような構成を防ぐための最良の方法は何でしょうか?

4

2 に答える 2

4

次のようなクラスがあるとします。

class Rule
{
    public string sourceDir; // dir file placed
    public string targetDir; // dir to move to
}

sourceDirそして、名前付き によって索引付けされたすべてのルールを含む辞書rules

次のような関数を書くことができます:

public bool RuleCausesCycle(Rule rule)
{
    return RuleCausesCycle(rule, new HashSet(CaseInsensitiveComparer.Default));
}

private bool RuleCausesCycle(Rule rule, Set visited)
{
     Rule targetRule;

     if (visited.Contains(rule.sourceDir))
     {
         return true;
     }

     if (rules.TryGetValue(rule.targetDir, out targetRule))
     {
         visited.Add(rule.sourceDir);

         return RuleCausesCycle(targetRule, visited);
     }

     return false;
}
于 2012-06-06T22:39:16.220 に答える
3

基本的に、有向グラフでサイクルを探しています。QuickGraph のようなグラフ ライブラリを使用します: http://quickgraph.codeplex.com/wikipage?title=Strongly%20Connected%20Components&referringTitle=Documentation

于 2012-06-06T22:25:21.180 に答える