我在正在使用的库中找到了这段代码:
public IEnumerable<BDDNode> Nodes {
get {
if (Low == null && High == null) {
return new [] { this };
} else {
return new [] { this }.Union(Low.Nodes.Union(High.Nodes));
}
}
}
问题出在大模型(数万个节点(上,该代码分配千兆字节的内存。
我有没有办法将new [] { this }
更改为不会在每次调用 getter 时创建对象的任何其他内容Nodes
?
乍一看,将其全部保留在 LinQ 领域内而不进行额外的具体化看起来更好:
private IEnumerable<BDDNode> ThisNodes {
get {
yield return this;
}
}
public IEnumerable<BDDNode> Nodes {
get {
if (Low == null && High == null) {
return this.ThisNodes;
} else {
return this.ThisNodes.Union(Low.Nodes.Union(High.Nodes));
}
}
}
但仍然不能解决您的问题,即Union
需要将所有结果集中在一个地方才能执行其功能。这目前是通过一个 Set 完成的,该集合迟早包含来自两个序列的所有(不同(元素。这是没有办法的。如果你想要一个联合(意味着重复删除(,你必须具体化你的数据。因此,也许您最好Concat
序列并担心以后重复项?连接两个序列纯粹是 LinQ 延迟执行,不涉及结果的具体化。
但这是一个设计决策,只有你可以根据你的算法做什么来做出。