Yga*_*bel 1 c# garbage-collection
我在我正在使用的库中找到了这段代码:
public IEnumerable<BDDNode> Nodes {
get {
if (Low == null && High == null) {
return new [] { this };
} else {
return new [] { this }.Union(Low.Nodes.Union(High.Nodes));
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题出在Big模型(万个节点)上,代码分配了数GB的内存.
我有办法改变其他new [] { this }任何在每次调用Nodesgetter时都不会创建对象的东西吗?
将它全部保留在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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
但仍然没有解决你的问题,即Union需要在一个地方获得所有结果来执行它的功能.目前,这是使用Set来完成的,该Set迟早包含来自两个序列的所有(不同)元素.没有办法解决这个问题.如果您想要一个联合(意味着重复删除),您必须实现您的数据.那么也许你可以通过Concat序列更好地服务并且稍后担心重复?连接两个序列纯粹是LinQ延迟执行,并且不涉及结果的具体化.
但这是一个设计决策,只有你可以根据你的算法做什么.