【发布时间】:2021-12-20 10:42:20
【问题描述】:
目前,我的代码如下所示:
private List<Node> dirtyNodes = new List<Node> dirtyNodes();
public void UpdateDirtyNodes()
{
while(dirtyNodes.Count > 0)
{
Node nodeToUpdate = dirtyNodes[0];
nodeToUpdate.UpdateNode();
dirtyNodes.Remove(nodeToUpdate);
}
}
public void MarkNodeDirty(Node node)
{
if(!dirtyNodes.Contains(node))
{
dirtyNodes.Add(node);
}
}
public void MarkNodeClean(Node node)
{
dirtyNodes.Remove(node);
}
这是代码中对性能至关重要的部分,它比我想要的要慢,因为dirtyNodes.Contains 在大多数情况下必须遍历整个数组。我想用HashSet 替换List,因为它应该更快,但我不知道如何使用UpdateDirtyNodes()。
困难在于UpdateNode() 可以随时从dirtyNodes 添加或删除节点,因此有点尴尬的while 循环。有没有办法从 HashSet 中获取“第一个”值?顺序无关紧要,我只需要停留在 while 循环中,直到 dirtyNodes 为空,然后更新接下来出现的任何节点。
我宁愿避免使用 Linq,因为此代码将成为库的一部分,我不想强迫它们包含 Linq。
我该怎么做?
【问题讨论】:
-
@Progman 不,我使用的是 C#。
-
dirtyNodes.First()没有做你想做的事吗? -
@41686d6564 我已经更新了这个问题。我不想使用 Linq,因为它将成为库的一部分,我不想强迫人们包含 Linq。或者也许我是偏执狂,Linq 很好,idk。
-
System.Linq 是 Microsoft 提供的框架部分。任何使用好的 C# 代码的地方都可以使用它
-
HashSet<T>实现IEnumerable<T>,所以你可以迭代它:foreach (var node in dirtyNodes) { node.UpdateNode(); }