我在我正在使用的库中找到了这段代码:
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 }
更改为在Nodes
getter的每次调用中都不会创建对象的任何其他内容?
答案 0 :(得分:5)
在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
需要在一个地方获取所有结果才能执行其功能的问题。 This is currently done with a Set迟早会包含两个序列中的所有(不同)元素。没有办法解决这个问题。如果你想要一个联合(意味着重复删除),你有来实现你的数据。那么也许你可以通过Concat
序列更好地服务,并担心以后会出现重复问题?连接两个序列纯粹是LinQ延迟执行,并且不涉及结果的具体化。
但这是一个设计决策,只有你可以根据算法的作用做出决定。