C# 禁用嵌套组件分支的最有效方法,理想情况下是O(1)操作

C# 禁用嵌套组件分支的最有效方法,理想情况下是O(1)操作,c#,graph,components,nested,C#,Graph,Components,Nested,我正在研究一些涉及执行许多细粒度命令并以同步确定性方式处理其副作用的东西。我有一个潜在的大型有向循环对象图,每个对象都包含一个委托。这些对象被分组为组件。组件是分层的,可以嵌套到任何深度。对象之间的连接可以跨越组件边界 有两个列表执行缓冲区,其中一些对象将添加到暂存缓冲区。当迭代执行缓冲区中的对象时,将执行它们的委托,其结果将确定是否有任何连接的对象将被放置在暂存缓冲区中。当迭代完成时,缓冲区被交换,前一个执行缓冲区被清除,循环重新开始 除了确定要添加到暂存缓冲区的连接对象外,某些委托还将导致禁

我正在研究一些涉及执行许多细粒度命令并以同步确定性方式处理其副作用的东西。我有一个潜在的大型有向循环对象图,每个对象都包含一个委托。这些对象被分组为组件。组件是分层的,可以嵌套到任何深度。对象之间的连接可以跨越组件边界

有两个列表执行缓冲区,其中一些对象将添加到暂存缓冲区。当迭代执行缓冲区中的对象时,将执行它们的委托,其结果将确定是否有任何连接的对象将被放置在暂存缓冲区中。当迭代完成时,缓冲区被交换,前一个执行缓冲区被清除,循环重新开始

除了确定要添加到暂存缓冲区的连接对象外,某些委托还将导致禁用组件。禁用时,不应处理该分支中的任何对象

我需要最有效的方法来指定/识别禁用的组件,以防止处理对象。以下是我知道的选项

仅在分支的父组件上设置禁用标志。在考虑执行每个对象时,请一直爬升到根组件,查看是否有任何对象被标记为禁用。。。直到On,其中n是对象所属组件的深度。这可以通过维护字典来优化,以便每个周期都需要对任何给定组件执行一次爬升

在分支中的所有组件上设置禁用标志。。。O1,因为它只需要检查其所有者是否设置了禁用标志。但如果启用,则将分支标记为禁用,其中n是分支中的组件数

为每个组件分配一对,以表示一个,并维护禁用间隔的全局记录。在考虑执行每个对象时,请检查其所属组件的间隔是否在禁用的间隔内。每个对象最多启用,其中n是禁用的组件数。这也可以通过维护字典来优化,以便每个周期都需要执行一次任何给定组件的间隔检查。我不确定它的可伸缩性。在分数开始用完小数点之前,分支可以有多大/嵌套多深

执行某种指针魔术,使分支中的所有组件共享一个禁用标志

编辑:
可以显式和/或隐式禁用组件的分支。显式表示分支已标记为禁用。隐式表示分支被视为已禁用,因为组件层次结构中的祖先分支被标记为已禁用。如果给定的分支C被显式禁用,并且祖先分支a也被禁用,则重新启用a不应导致启用C。考虑到这一点,我不知道选项4如何处理指针或共享引用。我考虑使用两个标志,一个用于显式设置,另一个用于隐式设置。一个组件的显式标志可以用作子组件的隐式标志。但这只允许我禁用直接子组件。

选项4听起来很有可能。您只需要一个引用类型,我称之为FlagHolder:


然后,每个组只创建一个将作为一个单元禁用的旗手,并将其传递给所有单独的对象。

你的意思是“非循环”吗?我的术语弄错了吗?对象具有输入和输出,但没有两个对象具有并行/双向连接。对象A连接到B连接到C连接到A。我认为这是循环的。但是对象分组的组件是分层的,没有任何递归方面。我补充了一个解释,说明了为什么我看不到选项4是如何工作的。需要有一种方法来组合组件和所有祖先组件的标志结果。也许可以通过将标志存储在位数组中并对位的子集执行Or来高效地完成这项工作。。。原来这是位数的“开”操作。@spruce:取决于需要多少标志。。。您可以使用ulong标志一次将64位或多个位组合在一起;bool或_结果=标志!=0;分支的深度可能超过64层,并且/或者分支的子级可能超过64层。也许有点像矩阵。这似乎有点无聊,因为这有点超出我的理解。现在,我想我将使用选项1和字典来存储在给定周期中访问过的组件。我应该创建一个自我回答还是等待其他人是否有任何意见?谢谢
class FlagHolder
{
    public bool IsDisabled;
}