public VariationalSeriesBuilder(STAT[] stats)
        {
            this.stats = stats;

            //измерения
            dimentions = stats.Length;

            //заполнение массивов шагов и кол-ва вариант в одномерном случае по измерению
            h = new double[dimentions];
            M = new int[dimentions];

            for (int i = 0; i < dimentions; i++)
            {
                h[i] = stats[i].h;
                M[i] = stats[i].M;
            }

            //создание многомерного массива
            array = Array.CreateInstance(typeof(VarintInSeries), M);

            //кол-во наблюдений
            N = stats[0].d.Length;

            //по каждой строке
            for (int i = 0; i < N; i++)
            {
                //индексы многомерного массива
                int[] indexes = new int[dimentions];

                //по каждому признаку
                //выясняем индексы варианты в многомерном ряде
                for (int j = 0; j < dimentions; j++)
                {
                    STAT currenStat = stats[j];
                    indexes[j] = (int)Math.Truncate((currenStat.d[i] - currenStat.Min) / h[j]);
                }

                //работа с самоц вариантой
                VarintInSeries CurrentVariant = array.GetValue(indexes) as VarintInSeries;

                if (CurrentVariant == null)
                {
                    array.SetValue(new VarintInSeries()
                    {
                        n = 1, p = 1d / N
                    }, indexes);
                }
                else
                {
                    CurrentVariant.Add(N);
                }
            }
        }
        public string OutputAllVariationalSeries()
        {
            string res = "";

            var i = 0;

            foreach (VarintInSeries item in array)
            {
                var coords = IndexToCoordinates(i++);

                VarintInSeries CurrentVariant = array.GetValue(coords) as VarintInSeries;
                if (CurrentVariant == null)
                {
                    continue;
                }


                //Console.WriteLine(string.Join(", ", coords));
                Func <double, double> r = v => Math.Round(v, 4);

                res += "(";
                for (int j = 0; j < dimentions; j++)
                {
                    var bottomValue = coords[j] * h[j] + stats[j].Min;
                    var topValue    = bottomValue + h[j];

                    res += r(bottomValue);
                    res += " - ";
                    res += r(topValue);

                    if (j != dimentions - 1)
                    {
                        res += ";     \t";
                    }
                }

                res += ")";

                res += string.Format("\t\tn = {0}\t\tp = {1:0.000}{2}", CurrentVariant.n, CurrentVariant.p, Environment.NewLine);
            }

            return(res);
        }