/// <summary> /// Reorganizes <see cref="AbstractChain"/> into <see cref="AbstractChain"/>. /// </summary> /// <param name="source"> /// Source chain. /// </param> /// <returns> /// The <see cref="AbstractChain"/>. /// </returns> public override AbstractChain Reorganize(AbstractChain source) { var result = source.Clone() as AbstractChain; if (result != null) { return result; } result = new BaseChain(); result.ClearAndSetNewLength(source.GetLength()); var iteratorRead = new IteratorSimpleStart(source, 1); var iteratorWrite = new IteratorWritableStart(result); iteratorRead.Reset(); iteratorWrite.Reset(); iteratorRead.Next(); iteratorWrite.Next(); for (int i = 0; i < source.GetLength(); i++) { iteratorWrite.WriteValue(iteratorRead.Current()); iteratorRead.Next(); iteratorWrite.Next(); } return result; }