はい、残念ながらループする必要があります。これは 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);
}
}
}
編集: Erich のコメントは、これが非効率的であると考える理由を示唆しています。最初のリストの末尾の「次の」ポインターと 2 番目の先頭の「前の」ポインターを更新して、2 つのリストを結合しないのはなぜですか? さて、2 番目のリストがどうなるか考えてみてください...それも変わっていたでしょう。
それだけでなく、それらのノードの所有権はどうなりますか? それぞれが本質的に 2 つのリストの一部になりました... しかし、LinkedListNode<T>.List
プロパティはそれらの 1 つについてのみ話すことができます。
場合によってはこれを行う理由はわかりますが、.NETLinkedList<T>
型が構築された方法では、基本的に禁止されています。このドキュメントのコメントが最もよく説明していると思います:
このLinkedList<T>)
クラスは、連鎖、分割、循環、またはリストを一貫性のない状態にする可能性のあるその他の機能をサポートしていません。