可枚举c#

时间:2018-01-15 13:10:00

标签: 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));
        }
    }
}

问题在于大型模型(万个节点), 代码分配千兆字节的内存。

我是否有办法将new [] { this }更改为在Nodes getter的每次调用中都不会创建对象的任何其他内容?

1 个答案:

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

但这是一个设计决策,只有你可以根据算法的作用做出决定。