gpt4 book ai didi

C#:为什么 LinkedList 没有采用谓词的 RemoveAll 方法?

转载 作者:太空狗 更新时间:2023-10-29 20:15:19 25 4
gpt4 key购买 nike

我有一个节点链表,每个节点存储一个边链表。我想按照

nodes.RemoveAll(n => n.edges.Count == 0)

但是如果没有 RemoveAll 就会发生这种情况。我不明白为什么它没有它,因为其他系列有。这也必须遍历所有元素,并且根据我的理解一次只删除一个元素,这对于链表来说性能不会差。

现在我必须改为这样做:

for (LinkedListNode<MyNode> n2 = nodes.First; n2 != null; )
{
LinkedListNode<MyNode> temp = n2.Next;
if (n2.Value.edges.Count == 0)
nodes.Remove(n2);
n2 = temp;
}

虽然它有效,但它使事情看起来比实际情况更复杂。

最佳答案

我不能说为什么那个方法不存在。这似乎是一种有用的方法。您可以使用扩展方法自己添加它。这是我的尝试(可能很糟糕,未经测试):

public static class LinkedListExtensions
{
public static void RemoveAll<T>(this LinkedList<T> linkedList,
Func<T, bool> predicate)
{
for (LinkedListNode<T> node = linkedList.First; node != null; )
{
LinkedListNode<T> next = node.Next;
if (predicate(node.Value))
linkedList.Remove(node);
node = next;
}
}
}

然后这个工作:

nodes.RemoveAll(n => n.edges.Count == 0);

或者你可以反转标准来选择你想要保留的元素并从中创建一个新的LinkedList:

nodes = new LinkedList<MyNode>(nodes.Where(n => n.edges.Count != 0));

关于C#:为什么 LinkedList 没有采用谓词的 RemoveAll 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218735/

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