解释此代码的工作原理

时间:2009-02-15 21:17:54

标签: c# algorithm

我在这里制作一个单独的帖子,因为我相信如果我写评论,评论不会将帖子推到顶部,因此会有通知任何已写入该帖子的人。

此代码由Micheal Buen在线程Writing text to the middle of a file提供:

        LinkedList<string> beatles = new LinkedList<string>();

        beatles.AddFirst("John");
        LinkedListNode<string> nextBeatles = beatles.AddAfter(beatles.First, "Paul");
        nextBeatles = beatles.AddAfter(nextBeatles, "George");
        nextBeatles = beatles.AddAfter(nextBeatles, "Ringo");
        nextBeatles = beatles.AddAfter(nextBeatles, "George");
        nextBeatles = beatles.AddAfter(nextBeatles, "Ringo");

        nextBeatles = beatles.AddAfter(nextBeatles, "George");
        nextBeatles = beatles.AddAfter(nextBeatles, "Ringo");

        nextBeatles = beatles.AddAfter(nextBeatles, "George");
        nextBeatles = beatles.AddAfter(nextBeatles, "Ringo");

        nextBeatles = beatles.AddAfter(nextBeatles, "George");
        nextBeatles = beatles.AddAfter(nextBeatles, "Ringo");


        // change the 1 to your 5th line
        LinkedListNode<string> paulsNode = beatles.NodeAt(6);
        LinkedListNode<string> recentHindrance = beatles.AddBefore(paulsNode, "Yoko");
        recentHindrance = beatles.AddBefore(recentHindrance, "Aunt Mimi");
        beatles.AddBefore(recentHindrance, "Father Jim");


        Console.WriteLine("{0}", string.Join("\n", beatles.ToArray()));

        Console.ReadLine();

public static class Helper
{
    public static LinkedListNode<T> NodeAt<T>(this LinkedList<T> l, int index)
    {
        LinkedListNode<T> x = l.First;

        while ((index--) > 0)
        {
                x = x.Next;
            Console.Write(x.Value);
            Thread.Sleep(10000);
        }



        return x;
    }
}

我想知道的是,扩展方法实现了什么?

第一遍,x = x.Next意味着我们正在看Ringo而不是George,依此类推。发动机罩下究竟发生了什么,以及从NodeAt(6)开始调用时代码的作用是什么?我问这一点,因为能够阅读和理解代码而不使用单步执行方法作为辅助是很重要的(例如,在工作中,您将阅读打印文档中的代码)。另外,为什么我们在循环中向后计数,为什么在进入循环体之前有一个括号要减1?

由于

1 个答案:

答案 0 :(得分:7)

扩展方法只遍历LinkedList n元素,它使用列表的第一个元素(l.First)初始化x,然后在while中,将索引递减为步骤n次{look x = x.Next;):

Index:  1           2            3            4
     _ _ _ _     _ _ _ _     _ _ _ _ _     _ _ _ _
    | John  |-> | Paul  |-> | George  |-> | Ringo |
     ‾ ‾ ‾ ‾     ‾ ‾ ‾ ‾     ‾ ‾ ‾ ‾ ‾     ‾ ‾ ‾ ‾

因此,如果您使用索引4(NodeAt(4))调用方法,它将获得第一个项目(John),减少计数器(减少到3),步进到下一个项目(Paul),再次减少(2),得到下一个项目(George),递减(到1),得到下一个项目(Ringo),然后递减到0,这将退出while 返回< / em> LinkedList项目,位于4位置(Ringo)。

此外,您可能需要检查System.Linq提供的ElementAt扩展方法,以实现相同的目标:

var linkedList = new LinkedList<string>(new []{"John", "Paul", "George", "Ringo"});
linkedList.ElementAt(3); // this returns you Ringo, note that 
                         // the index is 0-based!