public override Variable Duplicate()
        {
            VariableDictionary v = new VariableDictionary();

            foreach (KeyValuePair <string, Variable> kp in Values)
            {
                v.SetValue(kp.Key, kp.Value.Duplicate());
            }
            v.LastChanger = LastChanger;
            v.LastChanged = LastChanged;
            return(v);
        }
 public override int CompareTo(object o)
 {
     if ((o is Variable) == false)
     {
         throw new InvalidOperationException();
     }
     if (o is VariableScalar)
     {
         return(1);
     }
     if (o is VariableList)
     {
         return(1);
     }
     if (o is VariableDictionary)
     {
         VariableDictionary v = (VariableDictionary)o;
         if (v.Values.Keys.Count > Values.Keys.Count)
         {
             return(-1);
         }
         if (v.Values.Keys.Count < Values.Keys.Count)
         {
             return(1);
         }
         List <string> a = new List <string>(Values.Keys);
         List <string> b = new List <string>(v.Values.Keys);
         a.Sort();
         b.Sort();
         for (int i = 0; i < a.Count; i++)
         {
             int res = a[i].CompareTo(b[i]);
             if (res != 0)
             {
                 return(res);
             }
             res = Values[a[i]].CompareTo(v.Values[a[i]]);
             if (res != 0)
             {
                 return(res);
             }
         }
         return(0);
     }
     return(-1);
 }