c# - 使向导导航不那么线性的简单算法

标签 c# algorithm logic

这应该是一个简单的逻辑问题,但出于某种原因,我已经为此苦苦挣扎了几个小时,试图想出一个半干净的算法来实现它。我在 SQL Server 背景下使用 MVC3,但即使您不了解 MVC,您仍然可以帮助我解决算法问题。

我正在编写一个使用类似于向导的界面的应用程序。目前,这些向导屏幕之间的导航是非常线性的(下一个按钮转到紧接其后的页面,上一个按钮转到紧接其前的页面)。由于范围变化(有趣,我知道),我现在被告知要降低线性度。

对于第一次运行,用户必须按线性顺序访问所有页面,如下所示:

Step 1
Step 2
Step 3
    SubStep 1
        Sub-SubStep 1
        Sub-SubStep 2
    SubStep 2
        Sub-SubStep 1
        Sub-SubStep 2
    ...
    SubStep *n*
        Sub-SubStep 1
        Sub-SubStep 2
Submission

其中 n 是可变的,基于在第 2 步中输入的内容。

向导提交后由管理员审核。如果他们发现信息丢失,他们可以解锁某些页面。当用户返回输入该信息时,他们应该只能查看那些特定的页面。例如,导航可能是这样的:

Step 2
Step 3
    SubStep 1
        Sub-SubStep2
Submission

我当前的实现包括数据库中的一个表,用于跟踪未锁定的页面。单击“下一步”按钮时,它会调用一个方法来确定下一页是什么。由于第 3 步中发生的奇怪且多变的导航,此方法是一个 if-else 分支噩梦,很容易被破坏。

我们将不胜感激任何关于简化这一点的建议。

最佳答案

如果您创建一个表示导航层次结构的树结构,一个 preorder traversal树的 将按所需的线性顺序访问页面。你可以运行这样的遍历,当你到达当前页面时,你可以继续遍历,直到找到一个未锁定的页面,这将是你想要的下一页。

伪代码:

class TreeNode:
    string name
    List<TreeNode> children

string findNextPage(TreeNode node, Set<string> unlockedPageNames, 
                    string currentPageName, ref bool currentPageFound):
    if currentPageFound && unlockedPageNames.Contains(node.name):
        return node.name
    if node.name == currentPageName:
        currentPageFound = true
    foreach child in children:
        result = findNextPage(child, unlockedPageNames, 
                              currentPageName, currentPageFound)
        if result != null:
            return result
    return null

string findNextPage(TreeNode node, Set<string> unlockedPageNames, 
                    string currentPageName):
    bool currentPageFound = false
    return findNextPage(node, unlockedPageNames, 
                        currentPageName, currentPageFound)

请注意,您需要一个根节点,其子节点必须是第 1 步、第 2 步和第 3 步。将此根节点传递给最后一个 findNextPage() 函数。

关于c# - 使向导导航不那么线性的简单算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11992633/

相关文章:

c# - 在 ItemsControl : how to Bind element of ItemSource to x:Name of UserControl? 内具有依赖属性的 UserControl

c# - 在对象名称中使用变量

algorithm - 寻找完全连接的组件?

algorithm - MCMC 的随机排列

clojure - 如何在 Clojure 中实现并行逻辑或提前终止

c# - 为什么 x86 JIT 比 x64 更聪明?

c# - SqlBulkCopy 性能

c++ - 使用 std::unique 时如何防止悬空指针?

haskell - 神灵如何运作?

在C中组合两个字符串