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); }
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); }