/// <summary>
        /// Returns a string representation of the array suitable for human visualisation
        /// </summary>
        /// <param name="a"></param>
        /// <param name="prefix"></param>
        /// <returns></returns>
        public static string AsciiArt(Array a, string prefix = "")
        {
            var sb = new StringBuilder();

            for (var i = 0; i < a.Length; i++)
            {
                sb.Append(prefix + " [" + i + "] - ");

                //if run out of values in dictionary 1
                object val = a.GetValue(i) ?? "Null";

                if (DictionaryHelperMethods.IsDictionary(val))
                {
                    sb.AppendLine(string.Format("\r\n {0}",
                                                DictionaryHelperMethods.AsciiArt((IDictionary)val, prefix + "\t")));
                }
                else if (val is Array)
                {
                    sb.AppendLine(string.Format("\r\n {0}", AsciiArt((Array)val, prefix + "\t")));
                }
                else
                {
                    sb.AppendLine(val.ToString());
                }
            }

            return(sb.ToString());
        }
        /// <summary>
        /// Returns a string representation of both arrays highlighting differences in array elements
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="prefix"></param>
        /// <returns></returns>
        public static string AsciiArt(Array a, Array b, string prefix = "")
        {
            var sb = new StringBuilder();

            for (var i = 0; i < Math.Max(a.Length, b.Length); i++)
            {
                sb.Append(prefix + " [" + i + "] - ");

                //if run out of values in dictionary 1
                if (i > a.Length)
                {
                    sb.AppendLine(string.Format(" \t <NULL> \t {0}", b.GetValue(i)));
                }
                //if run out of values in dictionary 2
                else if (i > b.Length)
                {
                    sb.AppendLine(string.Format(" \t {0} \t <NULL>", a.GetValue(i)));
                }
                else
                {
                    object val1 = a.GetValue(i);
                    object val2 = b.GetValue(i);

                    if (DictionaryHelperMethods.IsDictionary(val1) && DictionaryHelperMethods.IsDictionary(val2))
                    {
                        sb.Append(string.Format("\r\n {0}",
                                                DictionaryHelperMethods.AsciiArt((IDictionary)val1,
                                                                                 (IDictionary)val2, prefix + "\t")));
                    }
                    else
                    if (val1 is Array && val2 is Array)
                    {
                        sb.Append(string.Format("\r\n {0}",
                                                AsciiArt((Array)val1,
                                                         (Array)val2, prefix + "\t")));
                    }
                    else
                    {
                        //if we haven't outrun of either array
                        sb.AppendLine(string.Format(" \t {0} \t {1} {2}",
                                                    val1,
                                                    val2,
                                                    FlexibleEquality.FlexibleEquals(val1, val2) ? "" : "<DIFF>"));
                    }
                }
            }

            return(sb.ToString());
        }