Example #1
0
        public virtual object Clone()
        {
            var c = (Conversation)this.MemberwiseClone();

            c.conversationId   = conversationId;
            c.conversationType = conversationType;

            if (root == null)
            {
                c.root = null;
                return(c);
            }

            c.root = (ConversationNode)root.Clone();

            var clonedNodes = new Dictionary <ConversationNode, ConversationNode> {
                { root, c.root }
            };
            var nodes = new Queue <ConversationNode>();

            nodes.Enqueue(root);

            while (nodes.Count > 0)
            {
                var original = nodes.Dequeue();
                var clone    = clonedNodes[original];

                for (var i = 0; i < original.getChildCount(); i++)
                {
                    var child = original.getChild(i);
                    // If the child has not been cloned yet
                    if (child != null && !clonedNodes.ContainsKey(child))
                    {
                        // We must create the clone
                        var clonedChild = (ConversationNode)child.Clone();
                        clonedNodes.Add(child, clonedChild);

                        // And we must clone its children in next iterations
                        nodes.Enqueue(child);
                    }

                    // And then we add the child to the current node
                    clone.addChild(child != null ? clonedNodes[child] : null);
                }
            }
            return(c);
        }
Example #2
0
        public virtual object Clone()
        {
            Conversation c = (Conversation)this.MemberwiseClone();

            c.conversationId   = (conversationId != null ? conversationId : null);
            c.conversationType = conversationType;

            Dictionary <ConversationNode, ConversationNode> clonedNodes =
                new Dictionary <ConversationNode, ConversationNode>();

            c.root = (root != null ? (ConversationNode)root.Clone() : null);

            clonedNodes.Add(root, c.root);
            List <ConversationNode> nodes   = new List <ConversationNode>();
            List <ConversationNode> visited = new List <ConversationNode>();

            nodes.Add(root);

            while (nodes.Count > 0)
            {
                ConversationNode temp   = nodes[0];
                ConversationNode cloned = clonedNodes[temp];
                nodes.RemoveAt(0);
                visited.Add(temp);

                for (int i = 0; i < temp.getChildCount(); i++)
                {
                    ConversationNode tempCloned = clonedNodes[temp.getChild(i)];
                    if (tempCloned == null)
                    {
                        tempCloned = (ConversationNode)temp.getChild(i).Clone();
                        clonedNodes.Add(temp.getChild(i), tempCloned);
                    }
                    cloned.addChild(tempCloned);

                    if (!visited.Contains(temp.getChild(i)) && !nodes.Contains(temp.getChild(i)))
                    {
                        nodes.Add(temp.getChild(i));
                    }
                }
            }
            return(c);
        }