如何获取LinkedList 中的第n个元素?

如何获取LinkedList实例的第n个元素? 是否有内置方式或我可能需要介绍我自己的实现? 例如扩展方法?

谢谢

ElementAt扩展方法将执行此操作:

 // This is 0-based of course var value = linkedList.ElementAt(n); 

不要忘记这是一个O(n)操作,因为LinkedList没有提供任何更有效的索引访问项目的方法。 如果您需要定期执行此操作,则表明您不应该使用链接列表。

您可以使用ElementAt()可枚举的扩展方法。 LinkedList本身不支持随机访问的原因是因为它对数据结构来说是一个相当低效的操作。 如果您经常这样做,您应该考虑使用更合适的数据结构。

你可以使用LINQ,如list.ElementAt(n)list.Skip(n - 1).First() ,但如果你发现自己对链表进行索引访问,你可能做错了(链表做了)没有有效地支持这项行动)。 也许另一种数据结构会更合适?

我需要获取列表的第二个元素(根据第二个元素更新第一个项目的值)

假设您正在采取必要的步骤以确保您有两个项目,您可以简单地执行此操作:

 list.First.Next.Value 

有一种更好的解决方案 – 在最坏的情况下至少要快x3。 certificate:

 //Test Name: TestLinkedListElementAtStart //Test Outcome: Passed //Result StandardOutput: //0 //Total milliseconds: 48,24 //Total milliseconds: 4,7386 [TestMethod] public void TestLinkedListElementAtStart() { var l = new LinkedList(); for (int i = 0; i < 1000; i++) { l.AddLast(i); } Console.WriteLine(l.OptimizedElementAt(0)); Performance.ConsoleWriteExecutionTime(() => l.ElementAt(0), 1000000); Performance.ConsoleWriteExecutionTime(() => l.OptimizedElementAt(0), 1000000); } //Test Name: TestLinkedListElementAtMiddle //Test Outcome: Passed //Result StandardOutput: //500 //Total milliseconds: 2990,9241 //Total milliseconds: 730,9262 [TestMethod] public void TestLinkedListElementAtMiddle() { var l = new LinkedList(); for (int i = 0; i < 1000; i++) { l.AddLast(i); } Console.WriteLine(l.OptimizedElementAt(l.Count / 2)); Performance.ConsoleWriteExecutionTime(() => l.ElementAt(l.Count / 2), 1000000); Performance.ConsoleWriteExecutionTime(() => l.OptimizedElementAt(l.Count / 2), 1000000); } //Test Name: TestLinkedListElementAtEnd //Test Outcome: Passed //Result StandardOutput: //999 //Total milliseconds: 5942,9193 //Total milliseconds: 4,6877 [TestMethod] public void TestLinkedListElementAtEnd() { var l = new LinkedList(); for (int i = 0; i < 1000; i++) { l.AddLast(i); } Console.WriteLine(l.OptimizedElementAt(l.Count - 1)); Performance.ConsoleWriteExecutionTime(() => l.ElementAt(l.Count - 1), 1000000); Performance.ConsoleWriteExecutionTime(() => l.OptimizedElementAt(l.Count - 1), 1000000); } 

代码是专有的,所以我不能分享,但只要知道你可以做数学..字面意思。 如果列表主要用于阅读,我还可以考虑更快的解决方案。