可枚举 c# 的分配内存



我在正在使用的库中找到了这段代码:

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 延迟执行,不涉及结果的具体化。

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

最新更新