我在这里做了一个单独的帖子,因为我相信如果我写评论,评论不会将线程推到顶部,因此会有任何写入该线程的人的通知.
此代码由Micheal Buen在线程写入文本中提供到文件中间:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,扩展方法实现了什么?
在第一次传球时,x = x.Next意味着我们正在看Ringo而不是George,依此类推.发动机罩下究竟发生了什么,以及从NodeAt(6)开始调用时代码的作用是什么?我问这一点,因为能够阅读和理解代码而不使用单步执行方法作为辅助是很重要的(例如,在工作中,您将阅读打印文档中的代码).另外,为什么我们在循环中向后计数,为什么在进入循环体之前有一个括号减1?
谢谢
扩展方法只遍历LinkedList n
元素,它x
使用列表的第一个元素(l.First)初始化,然后在while中,它将索引递减到step forward n
times(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,并返回 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!
Run Code Online (Sandbox Code Playgroud)