我有一个应用程序,它有一个数据树作为数据后端。为了实现 MVVM 模式,我有一个封装数据树的类的逻辑层。因此逻辑也被安排在树中。如果输入处于有效状态,则应将数据复制到第二个线程,该线程用作最后一个有效状态的双缓冲区。因此,一种方法是克隆。
另一种方法是将完整的数据后端实现为不可变的。如果输入新内容,这将意味着重建整个数据树。我的问题是,有没有实用的方法来做到这一点?我被困在必须将数据树有效地重新分配给逻辑层的地步。
**更新 - 一些代码
我们正在做的是抽象出我们用来运行实验的硬件设备。因此,我们定义了诸如“机箱、序列、卡片、通道、步骤”之类的类。那些构建一个像这样的树结构:
Chassis
/ \
Sequence1 Sequence2
/ | \
Card1 Card2 Card3
/ \
Channel1 Channel2
/ \
Step1 Step2
在代码中它看起来像这样:
public class Chassis{
readonly var List<Sequence> Sequences = new List<Sequence>();
}
public class Sequence{
readonly var List<Card> Cards = new List<Card>();
}
等等。当然,每个类都有更多属性,但这些属性很容易处理。我现在的问题是 List 是一个可变对象。我可以调用 List.Add() 并且它改变了。好的,有一个 ReadOnlyList 但我不确定它是否以正确的方式实现了不变性。就像按值复制而不是引用,而不仅仅是通过阻止 set 方法来阻止写入它。下一个问题是序列和步骤的数量可能会有所不同。出于这个原因,我需要列表元素的原子交换。目前我没有更多的代码,因为我仍在考虑这种方式是否对我有帮助,以及是否有可能在合理的时间内实现它。