gpt4 book ai didi

c# - 为可枚举的c#分配内存

转载 作者:太空宇宙 更新时间:2023-11-03 19:44:20 24 4
gpt4 key购买 nike

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

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 时创建对象的任何其他内容?

最佳答案

将其全部保留在 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 延迟执行,不涉及结果的具体化。

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

关于c# - 为可枚举的c#分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48263675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com