public static DoubleLinkedList <T> Of(IEnumerable <T> source) { if (ReferenceEquals(source, null)) { throw new ArgumentNullException("Can not clone list from 'null'"); } var list = new DoubleLinkedList <T>(); if (source is DoubleLinkedList <T> ) { return(FromList((DoubleLinkedList <T>)source)); } foreach (T element in source) { var elem = Utils.Clone(element); if (!ReferenceEquals(elem, null)) { list.Push((T)elem); } } return(list); }
private static DoubleLinkedList <T> FromList(DoubleLinkedList <T> source) { if (ReferenceEquals(source, null)) { throw new ArgumentNullException("Can not clone list from 'null'"); } var list = new DoubleLinkedList <T>(); var node = source.Head; int?currPos = null; for (int i = 0; i < source.Length; i++) { var val = Utils.Clone(node.Value); list.Push((T)val); if (ReferenceEquals(node, source.CurrentNode) && !ReferenceEquals(source.CurrentNode, null)) { currPos = i; } node = node.Next; } if (!ReferenceEquals(currPos, null)) { list.MoveCurrentToHead(); for (int i = 0; i < currPos; i++) { list++; } } return(list); }