可枚举c#的分配内存

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时都不会创建对象的东西吗?

nvo*_*igt 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

仍然没有解决你的问题,即Union需要在一个地方获得所有结果来执行它的功能.目前,这是使用Set完成的,该Set迟早包含来自两个序列的所有(不同)元素.没有办法解决这个问题.如果您想要一个联合(意味着重复删除),您必须实现您的数据.那么也许你可以通过Concat序列更好地服务并且稍后担心重复?连接两个序列纯粹是LinQ延迟执行,并且不涉及结果的具体化.

但这是一个设计决策,只有你可以根据你的算法做什么.