是的,不幸的是,你必须循环。这是一个 O(n) 操作 - 添加的每个条目都是 O(1)。没有需要调整缓冲区大小和复制等的风险 - 尽管垃圾收集当然可能会大致做到这一点:) 你甚至可以编写方便的扩展方法:
public static class LinkedListExtensions
{
public static void AppendRange<T>(this LinkedList<T> source,
IEnumerable<T> items)
{
foreach (T item in items)
{
source.AddLast(item);
}
}
public static void PrependRange<T>(this LinkedList<T> source,
IEnumerable<T> items)
{
LinkedListNode<T> first = source.First;
// If the list is empty, we can just append everything.
if (first is null)
{
AppendRange(source, items);
return;
}
// Otherwise, add each item in turn just before the original first item
foreach (T item in items)
{
source.AddBefore(first, item);
}
}
}
编辑:埃里希的评论暗示了为什么你可能认为这是低效的——为什么不通过更新第一个列表尾部的“下一个”指针和第二个列表头部的“上一个”指针来将两个列表连接在一起?好吧,想想第二个列表会发生什么……它也会改变。
不仅如此,这些节点的所有权会发生什么变化?现在,每个基本上都是两个列表的一部分……但该LinkedListNode<T>.List
物业只能谈论其中一个。
虽然我可以理解为什么在某些情况下您可能想要这样做,但 .NETLinkedList<T>
类型的构建方式基本上禁止它。我认为这个文档评论解释得最好:
该类LinkedList<T>)
不支持可能使列表处于不一致状态的链接、拆分、循环或其他功能。