Код С# double [] mas выдает ошибку

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
C#:
            double R = double.Parse(project.Variables["q"].Value);
            double[] mas = { 1, 2, 1.1, 1.3};
            double temp = 0, t = double.MaxValue;
 
            for (int i = 0; i < mas.Length; i++)
            {
                double a = Math.Abs(mas[i] - R);
 
                if (a < t)
                {
                    temp = mas[i];
                    t = a;
                }
            }
            return temp;
Вот такой вот код, переменная q это 1,
double[] mas = { 1, 2, 1.1, 1.3}; это список в котором содержатся числа
задача, понять какое из массива чисел ближе к единице.
Вот в таком варианте код работает, но если я вместо списка чисел подставляю переменную то ничего не работает. Пробовал разные варианты, вставлять много переменных, или собрать из списка и вставить в {}

вот так:

C#:
            double R = double.Parse(project.Variables["q"].Value);
            double[] mas = { project.Variables["TYT_CHISLA"].Value};
            double temp = 0, t = double.MaxValue;
 
            for (int i = 0; i < mas.Length; i++)
            {
                double a = Math.Abs(mas[i] - R);
 
                if (a < t)
                {
                    temp = mas[i];
                    t = a;
                }
            }
            return temp;
но выдает ошибку... Надеюсь на силу форума!
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
double[] mas = { project.Variables["TYT_CHISLA"].Value};
массив double а переменная строка. надо конвертировать строку в массив.
 

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
с примером туго. не конвертировал в этот тип данных. пример текстовой строчки приведите, более опытные программеры помогут с кодом
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
можно с примером пожалуйста, я плохо разбираюсь в коде
Нужно сначала разделить строку, затем каждое значение конвертировать.


C#:
List<double> mas = new List<double>();

project.Variables["TYT_CHISLA"].Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(s => !string.IsNullOrWhiteSpace(s))
    .ToList()
    .ForEach(d => mas.Add(double.Parse(d, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture)));
 
  • Спасибо
Реакции: eee и alexwhite

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
Нужно сначала разделить строку, затем каждое значение конвертировать.


C#:
List<double> mas = new List<double>();

project.Variables["TYT_CHISLA"].Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(s => !string.IsNullOrWhiteSpace(s))
    .ToList()
    .ForEach(d => mas.Add(double.Parse(d, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture)));
спасибо, на будущее буду знать, а вообще решил свой вопрос через js, там не надо было так сильно замарачиваться)
 

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
Продолжаю испытывать трудности с C#, но на этот раз с другим кодом

C#:
    public static void Main(string[] args)
    {
        double[] xVal = new double[]{0, 1, 2};
        double[] yVal = new double[]{20, 22, 24};
        double rsquared;
        double yintercept;
        double slope;
        LinearRegression(xVal, yVal, 0, xVal.Length, out rsquared, out yintercept, out slope);
        Console.WriteLine("offset: " + yintercept);
        Console.WriteLine("gain: " + slope);
        Console.WriteLine(yintercept + (slope * 15)); //15 is xvalue of future(no of day from 1)
    }

    public static void LinearRegression(double[] xVals, double[] yVals, int inclusiveStart, int exclusiveEnd, out double rsquared, out double yintercept, out double slope)
    {
        //Debug.Assert(xVals.Length == yVals.Length);
        double sumOfX = 0;
        double sumOfY = 0;
        double sumOfXSq = 0;
        double sumOfYSq = 0;
        double ssX = 0;
        double ssY = 0;
        double sumCodeviates = 0;
        double sCo = 0;
        double count = exclusiveEnd - inclusiveStart;
        for (int ctr = inclusiveStart; ctr < exclusiveEnd; ctr++)
        {
            double x = xVals[ctr];
            double y = yVals[ctr];
            sumCodeviates += x * y;
            sumOfX += x;
            sumOfY += y;
            sumOfXSq += x * x;
            sumOfYSq += y * y;
        }

        ssX = sumOfXSq - ((sumOfX * sumOfX) / count);
        ssY = sumOfYSq - ((sumOfY * sumOfY) / count);
        double RNumerator = (count * sumCodeviates) - (sumOfX * sumOfY);
        double RDenom = (count * sumOfXSq - (sumOfX * sumOfX)) * (count * sumOfYSq - (sumOfY * sumOfY));
        sCo = sumCodeviates - ((sumOfX * sumOfY) / count);
        double meanX = sumOfX / count;
        double meanY = sumOfY / count;
        double dblR = RNumerator / Math.Sqrt(RDenom);
        rsquared = dblR * dblR;
        yintercept = meanY - ((sCo / ssX) * meanX);
        slope = sCo / ssX;
    }

Думал что запустить будет легко, так как на https://dotnetfiddle.net/YQ3so4 работает без проблем, но не тут то было, надеюсь на силу форума!
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Продолжаю испытывать трудности с C#, но на этот раз с другим кодом
Это вставляешь в кубик C#
C#:
double[] xVal = new double[]{0, 1, 2};
double[] yVal = new double[]{20, 22, 24};
double rsquared;
double yintercept;
double slope;
CommonCode.LinearRegression(xVal, yVal, 0, xVal.Length, out rsquared, out yintercept, out slope);

//return yintercept.ToString();
Вызываешь с помощью строки
C#:
CommonCode.LinearRegression(xVal, yVal, 0, xVal.Length, out rsquared, out yintercept, out slope);

Эту часть в ownCode, сразу после // Insert your code here
C#:
        public static void LinearRegression(double[] xVals, double[] yVals, int inclusiveStart, int exclusiveEnd, out double rsquared, out double yintercept, out double slope)
        {
            //Debug.Assert(xVals.Length == yVals.Length);
            double sumOfX = 0;
            double sumOfY = 0;
            double sumOfXSq = 0;
            double sumOfYSq = 0;
            double ssX = 0;
            double ssY = 0;
            double sumCodeviates = 0;
            double sCo = 0;
            double count = exclusiveEnd - inclusiveStart;
            for (int ctr = inclusiveStart; ctr < exclusiveEnd; ctr++)
            {
                double x = xVals[ctr];
                double y = yVals[ctr];
                sumCodeviates += x * y;
                sumOfX += x;
                sumOfY += y;
                sumOfXSq += x * x;
                sumOfYSq += y * y;
            }

            ssX = sumOfXSq - ((sumOfX * sumOfX) / count);
            ssY = sumOfYSq - ((sumOfY * sumOfY) / count);
            double RNumerator = (count * sumCodeviates) - (sumOfX * sumOfY);
            double RDenom = (count * sumOfXSq - (sumOfX * sumOfX)) * (count * sumOfYSq - (sumOfY * sumOfY));
            sCo = sumCodeviates - ((sumOfX * sumOfY) / count);
            double meanX = sumOfX / count;
            double meanY = sumOfY / count;
            double dblR = RNumerator / Math.Sqrt(RDenom);
            rsquared = dblR * dblR;
            yintercept = meanY - ((sCo / ssX) * meanX);
            slope = sCo / ssX;
        }
 

Вложения

  • Спасибо
Реакции: alexwhite и Moadip

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Продолжаю испытывать трудности с C#, но на этот раз с другим кодом

C#:
    public static void Main(string[] args)
    {
        double[] xVal = new double[]{0, 1, 2};
        double[] yVal = new double[]{20, 22, 24};
        double rsquared;
        double yintercept;
        double slope;
        LinearRegression(xVal, yVal, 0, xVal.Length, out rsquared, out yintercept, out slope);
        Console.WriteLine("offset: " + yintercept);
        Console.WriteLine("gain: " + slope);
        Console.WriteLine(yintercept + (slope * 15)); //15 is xvalue of future(no of day from 1)
    }

    public static void LinearRegression(double[] xVals, double[] yVals, int inclusiveStart, int exclusiveEnd, out double rsquared, out double yintercept, out double slope)
    {
        //Debug.Assert(xVals.Length == yVals.Length);
        double sumOfX = 0;
        double sumOfY = 0;
        double sumOfXSq = 0;
        double sumOfYSq = 0;
        double ssX = 0;
        double ssY = 0;
        double sumCodeviates = 0;
        double sCo = 0;
        double count = exclusiveEnd - inclusiveStart;
        for (int ctr = inclusiveStart; ctr < exclusiveEnd; ctr++)
        {
            double x = xVals[ctr];
            double y = yVals[ctr];
            sumCodeviates += x * y;
            sumOfX += x;
            sumOfY += y;
            sumOfXSq += x * x;
            sumOfYSq += y * y;
        }

        ssX = sumOfXSq - ((sumOfX * sumOfX) / count);
        ssY = sumOfYSq - ((sumOfY * sumOfY) / count);
        double RNumerator = (count * sumCodeviates) - (sumOfX * sumOfY);
        double RDenom = (count * sumOfXSq - (sumOfX * sumOfX)) * (count * sumOfYSq - (sumOfY * sumOfY));
        sCo = sumCodeviates - ((sumOfX * sumOfY) / count);
        double meanX = sumOfX / count;
        double meanY = sumOfY / count;
        double dblR = RNumerator / Math.Sqrt(RDenom);
        rsquared = dblR * dblR;
        yintercept = meanY - ((sCo / ssX) * meanX);
        slope = sCo / ssX;
    }

Думал что запустить будет легко, так как на https://dotnetfiddle.net/YQ3so4 работает без проблем, но не тут то было, надеюсь на силу форума!
блин. ну опять доставать стеклянный шар, пыль с него сдувать....
что за проблемы ? ошибки или что ? скрин там или с лога что ни будь.
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
блин. ну опять доставать стеклянный шар, пыль с него сдувать....
Тут и без стеклянного шара все понятно.:-)
@RoyalBank уже все написал, что и как.

А трудности возникают из за непонимания азов C# и непонимания как юзать экшен C# зенки.
Экшен C# это метод. Т.е. в нем можно выполнить то, что можно выполнить в обычном методе. Не запихаешь же в обычный метод классы и несколько методов.
Ну ок, метод в виде лямбды/делегата можно запихать в другой метод, но про это молчу.

Поэтому если что то сложнее простого куска кода, несколько методов, классы, то это все пихается в owncode.

Но вообще возникает вопрос к автору топика, зачем все эти извращения.
Приведенные куски кода вообще никак не связаны с зенкой, и особой практической ценности в них не вижу. Это больше похоже на лабу по кодингу.
Хочется поупражняться в программировании, ну тогда лучше это делать в студии, а не в зенке.
 

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
Это вставляешь в кубик C#
C#:
double[] xVal = new double[]{0, 1, 2};
double[] yVal = new double[]{20, 22, 24};
double rsquared;
double yintercept;
double slope;
CommonCode.LinearRegression(xVal, yVal, 0, xVal.Length, out rsquared, out yintercept, out slope);

//return yintercept.ToString();
Вызываешь с помощью строки
C#:
CommonCode.LinearRegression(xVal, yVal, 0, xVal.Length, out rsquared, out yintercept, out slope);

Эту часть в ownCode, сразу после // Insert your code here
C#:
        public static void LinearRegression(double[] xVals, double[] yVals, int inclusiveStart, int exclusiveEnd, out double rsquared, out double yintercept, out double slope)
        {
            //Debug.Assert(xVals.Length == yVals.Length);
            double sumOfX = 0;
            double sumOfY = 0;
            double sumOfXSq = 0;
            double sumOfYSq = 0;
            double ssX = 0;
            double ssY = 0;
            double sumCodeviates = 0;
            double sCo = 0;
            double count = exclusiveEnd - inclusiveStart;
            for (int ctr = inclusiveStart; ctr < exclusiveEnd; ctr++)
            {
                double x = xVals[ctr];
                double y = yVals[ctr];
                sumCodeviates += x * y;
                sumOfX += x;
                sumOfY += y;
                sumOfXSq += x * x;
                sumOfYSq += y * y;
            }

            ssX = sumOfXSq - ((sumOfX * sumOfX) / count);
            ssY = sumOfYSq - ((sumOfY * sumOfY) / count);
            double RNumerator = (count * sumCodeviates) - (sumOfX * sumOfY);
            double RDenom = (count * sumOfXSq - (sumOfX * sumOfX)) * (count * sumOfYSq - (sumOfY * sumOfY));
            sCo = sumCodeviates - ((sumOfX * sumOfY) / count);
            double meanX = sumOfX / count;
            double meanY = sumOfY / count;
            double dblR = RNumerator / Math.Sqrt(RDenom);
            rsquared = dblR * dblR;
            yintercept = meanY - ((sCo / ssX) * meanX);
            slope = sCo / ssX;
        }

Большое человеческое спасибо, почти все работает как надо! Теперь вернулась старая проблема которую я решил с помощью js, то есть добавить массив чисел в код С# вот в эти две строки

xVal = new double[]{0, 1, 2};
double[] yVal = new double[]{20, 22, 24};
double rsquared;

пробовал тот вариант который вы написали выше, но ПМ ругается.

"
Компиляция кода Ошибка в действии "CS1061" ""System.Collections.Generic.List<double>" не содержит определение для "Length". Не удалось найти метод расширения "Length", принимающий первый аргумент типа "System.Collections.Generic.List<double>" (пропущена директива using или ссылка на сборку?)". [Строка: 11; Cтолбец: 49]

"

блин. ну опять доставать стеклянный шар, пыль с него сдувать....
что за проблемы ? ошибки или что ? скрин там или с лога что ни будь.
В следующий раз буду более точен :-)

Тут и без стеклянного шара все понятно.:-)
@RoyalBank уже все написал, что и как.

А трудности возникают из за непонимания азов C# и непонимания как юзать экшен C# зенки.
Экшен C# это метод. Т.е. в нем можно выполнить то, что можно выполнить в обычном методе. Не запихаешь же в обычный метод классы и несколько методов.
Ну ок, метод в виде лямбды/делегата можно запихать в другой метод, но про это молчу.

Поэтому если что то сложнее простого куска кода, несколько методов, классы, то это все пихается в owncode.

Но вообще возникает вопрос к автору топика, зачем все эти извращения.
Приведенные куски кода вообще никак не связаны с зенкой, и особой практической ценности в них не вижу. Это больше похоже на лабу по кодингу.
Хочется поупражняться в программировании, ну тогда лучше это делать в студии, а не в зенке.
Я подозревал что нужно использовать свой код, но у меня все рано не вышло так же как у @RoyalBank :-) и да вы правы, у меня от слова совсем нет знаний в си шарпе, все это можно сделать с помощью кубиков, и я уже это сделал, но при запуске требуется слишком много времени для обработки данных, ищу способы оптимизации...

и на будущее может быть будет кому полезно, так как Зенка очень разносторонняя программа :-)
 

Вложения

  • 17,3 КБ Просмотры: 1

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
все тему можно закрывать @RoyalBank помог разобраться! надо было в коде заменить Length на Count и все заработало
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)