c#/.net x.x是否有双链表(可以向后迭代)的实现?

c#/.net x.x是否有双链表(可以向后迭代)的实现?,c#,.net,collections,linked-list,iteration,C#,.net,Collections,Linked List,Iteration,我一直在寻找c#中双链表的标准实现(这样我就有了一个可以向后迭代的链表),但找不到。我觉得这么简单的东西必须有一个实现,我只是错过了 如果确实存在,它是针对哪个版本的c#/.net存在的 通常情况下,反向迭代似乎不是在c#中完成的。是我的思维太多地停留在c++/stl模式中,还是这是c#非常缺乏的东西 我知道LinkedList,但由于未能找到向后迭代的方法,我认为它是单独链接的 如果LinkedList是双链接的,如何向后(有效地)迭代它呢?System.Collections.Generic

我一直在寻找c#中双链表的标准实现(这样我就有了一个可以向后迭代的链表),但找不到。我觉得这么简单的东西必须有一个实现,我只是错过了

如果确实存在,它是针对哪个版本的c#/.net存在的

通常情况下,反向迭代似乎不是在c#中完成的。是我的思维太多地停留在c++/stl模式中,还是这是c#非常缺乏的东西

我知道LinkedList,但由于未能找到向后迭代的方法,我认为它是单独链接的


如果LinkedList是双链接的,如何向后(有效地)迭代它呢?

System.Collections.Generic.LinkedList()如何

以下是MSDN上的文档:

版本信息
.NET框架:在3.5、3.0、2.0中受支持
.NET Compact Framework:在3.5、2.0中受支持
XNA框架:3.0、2.0、1.0中支持


也就是说,我和其他人一样,在使用如此丰富的框架时,通常更倾向于使用更高的抽象

怎么样?

以下代码将高效地反向迭代LinkedList:

        LinkedList<string> list = new LinkedList<string>
            (new[] {"cat", "dog", "frog", "antelope", "gazelle"});
        LinkedListNode<string> item = list.Last;
        do
        {
            Console.WriteLine(item.Value);
            item = item.Previous;
        }
        while (item != null);
        Console.ReadKey();
LinkedList=新建LinkedList
(新[]{“猫”、“狗”、“青蛙”、“羚羊”、“瞪羚”});
LinkedListNode项=list.Last;
做
{
Console.WriteLine(项值);
项目=项目。以前的;
}
while(item!=null);
Console.ReadKey();
这里的关键是LinkedList只包含对列表的第一个和最后一个LinkedListNode实例的引用。每个LinkedListNode实例都包含对列表中下一个和上一个项目的引用(或列表两端的null)以及一个Value属性。这意味着从第一个或最后一个LinkedListNode进行迭代很容易,但随机访问需要从列表中的第一个或最后一个进行迭代


如果需要在此过程中进行插入,请使用LinkedList.AddBefore或AddAfter插入新的LinkedListNode。

以及此处给出的答案,您可以将扩展方法写入
LinkedList
,以使其更易于重用:

public static IEnumerable<T> Backwards<T>(this LinkedList<T> list)
{
    LinkedListNode<T> node= list.Last;
    while (node != null)
    {
        yield return node.Value;
        node = node.Previous;
    }
}

我有一个特殊的需求,需要能够向后迭代列表,并有便宜的插入+便宜的重新排序。好的,那么我的答案的第一部分应该会帮助你。RTFM是没有帮助的,特别是因为文档没有专门处理反向迭代。如果我们只是告诉每个人使用RTFM,那么为什么要使用Stackoverflow呢?这几乎不是RTFM。您要求.net实现双链接列表,我给了您相关框架对象的名称,回答了您关于框架的哪些版本支持它的问题,并给了您一个指向该框架文档的链接。您从未要求代码显示反向迭代,您只是在考虑是否打算这样做。我唯一没有回答的问题是“我的思想是不是被卡住了…”,我把它当成了修辞。对不起,我误解了你。“好的,那么我的答案的第一部分应该对你有帮助”对我的迭代的回应看起来像是一个RTFM。你如何有效地向后迭代它呢?while(nodeP!=null)nodeP=nodeP.Previous;这就是我一直在寻找的。不知什么原因,我觉得这个列表。最后一个会返回T型的东西。谢谢。不知何故,你似乎是唯一一个理解这个问题甚至是链表背后的概念的人:一个被低估了很多的容器。很高兴提供帮助。如果列表为空,这将引发ArgumentNullException。将do/while循环更改为(更易于阅读,IMO)while循环将解决问题-请参见我的答案中的一个示例。是的,我看到了这一点,只是在头脑中转换为while循环,而没有考虑do/while的含义。谢谢。我有点困惑,为什么这样的东西不只是在标准库中。@Catskul这里有一个很好的链接来解释这一点。@Matt:谢谢。尽管如此,在列表上向后迭代是一项比前面讨论的“ForEach”更基本的功能(例如,大多数STL容器都提供了向后迭代),而且尽管没有,但C#创建者似乎建议您不应该这样做。在C#中,即使我知道如何通过自己实现它来做某事,我觉得如果我没有找到一个简单的方法,我一定错过了什么/做错了什么。
foreach (string x in list.Backwards())
{
    // ...
}