Tak, masz do pętli, niestety. Jest to operacja O (n) - O (1) dla każdego dodanego wpisu. Nie ma ryzyka wymagające bufor być zmieniany i kopiowane, etc - choć oczywiście zbieranie śmieci może zrobić z grubsza, że :) Można nawet napisać przydatnych metod rozszerzeń:
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;
foreach (T item in items)
{
source.AddBefore(first, item);
}
}
}
EDIT: Komentarz Ericha sugeruje, dlaczego może myśleć jest to nieefektywne - dlaczego nie po prostu dołączyć do dwóch list razem, aktualizując "następny" wskaźnik ogona pierwszej listy i "poprzedni" wskaźnik głowy drugiego? Cóż, pomyśl o tym, co stanie się z drugą listą ... to też zmieniłoby się.
Nie tylko to, ale co stałoby się z własnością tych węzłów? Każda z nich jest obecnie częścią dwóch list ... ale właściwość LinkedListNode<T>.List
może mówić tylko o jednym z nich.
Podczas gdy widzę, dlaczego warto to zrobić w niektórych przypadkach, sposób, w jaki został zbudowany typ .NET LinkedList<T>
, w zasadzie go uniemożliwia. Myślę, że to wyjaśnia doc komentarz to najlepiej:
Klasa LinkedList<T>)
ma nie obsługują łączenia, podziału, cykle lub innych cech, które mogą opuścić listę w niespójnym państwa.
-1 wygląda na to, że intellisense mogło odpowiedzieć na twoje pytanie –
Dołączanie do powiązanych list nie wydaje się być również bardzo częstym zadaniem; jeśli pamiętam moje kursy struktur danych z powrotem w ciągu dnia. Listy i powiązane listy to nie to samo. Mają różne cele; tak więc zachowanie (lub jego brak) ma sens. –
llist1.AddLast (llist2.First) nie działa, ponieważ llist1/llist2 są listami podwójnie powiązanymi. Gdyby było to dozwolone, który "poprzedni" węzeł byłby odsyłany przez węzeł podany do AddLast? Z tego powodu nie może być członkiem dwóch list. –