コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }