Найти пики в массиве данных C#

alexwhite

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

Итак есть снипет на c# который позволяет искать пики из массива чисел, он работает, но только с int, а нужно как всегда double...

49614


добавил два шаблона, рабочий и не рабочий,

исправления делал в не рабочем шаблоне, т.е. изменил все int на double, Lenght поменял на Count, но заставить скрипт работать не получилось

Так же интересно как можно вывести весь список ответов как это происходит при работе скрипта rextester.com/IML43119

у меня Return возвращает только одно значение, СПАСИБО :-)

ПС
Если кому то лень качать шаб

Тот с которым я пытаюсь что то сделать:

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

    project.Variables["Y"].Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(s => !string.IsNullOrWhiteSpace(s))
    .ToList()
    .ForEach(d => values.Add(double.Parse(d, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture)));
            List<double> curInterval = new List<double>();

            bool decreasing = false;
            for (double i = 0; i < values.Count; i++)
            {
                if (curInterval.Count > 0)
                {
                    if (values[i] < curInterval.Last() && !decreasing)
                    {
                        return ("Position: " + (i - 1).ToString() + ", peak value: " + curInterval.Last());
                        curInterval.Clear();
                        decreasing = true;
                    }
                    else if (values[i] >= curInterval.Last() && decreasing)
                    {
                        decreasing = false;
                    }
                }
                curInterval.Add(values[i]);
            }

Рабочий:

C#:
            int[] values = new int[] {93, 113, 113, 75, 50, 94, 127, 118, 63, 62, 111, 129, 105, 49, 77, 124, 132, 92, 48, 98, 137, 132, 78, 60, 116, 145, 124, 65, 78, 129, 150, 113, 58, 97, 146, 151, 94, 62, 113, 157, 143, 73, 73, 134, 162, 129, 63, 93, 148, 158, 112, 63, 114, 160, 152, 90, 73, 132, 166, 144, 73, 89, 150, 167, 126, 67, 110, 161, 164, 105, 69, 128, 168, 155, 82, 89, 146, 170, 137, 74, 107, 160, 171, 121, 72, 123, 171, 168, 105, 82, 144, 173, 155, 82, 100, 160, 176, 139, 78, 120, 168, 172, 114, 78, 136, 173, 162, 97, 95, 157, 182, 146, 79, 110, 162, 176, 126, 75, 129, 177, 167, 103, 85, 147, 175, 152, 86, 103, 158, 174, 132, 75, 117, 166, 170, 112, 74, 134, 172, 155, 84, 92, 151, 171, 140, 74, 105, 160};
            List<int> curInterval = new List<int>();

            bool decreasing = false;
            for (int i = 0; i < values.Length; i++)
            {
                if (curInterval.Count > 0)
                {
                    if (values[i] < curInterval.Last() && !decreasing)
                    {
                        return ("Position: " + (i - 1).ToString() + ", peak value: " + curInterval.Last());
                        curInterval.Clear();
                        decreasing = true;
                    }
                    else if (values[i] >= curInterval.Last() && decreasing)
                    {
                        decreasing = false;
                    }
                }
                curInterval.Add(values[i]);
            }
 

Вложения

Последнее редактирование:

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
Замени в цикле double на int
C#:
for (int i = 0; i < values.Count; i++)
 
  • Спасибо
Реакции: alexwhite

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
Замени в цикле double на int
C#:
for (int i = 0; i < values.Count; i++)
Спасибо! Заработало)))

а по второму пункту можешь подсказать, как вывести все пики? а то выходит только один результат
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
Опиши подробно свою задачу.
если запустить C# на сайте rextester.com/IML43119 то выдаст вот такую композицию

Position: 2, peak value: 113
Position: 6, peak value: 127
Position: 11, peak value: 129
Position: 16, peak value: 132
Position: 20, peak value: 137
Position: 25, peak value: 145
Position: 30, peak value: 150
Position: 35, peak value: 151
Position: 39, peak value: 157
Position: 44, peak value: 162
Position: 49, peak value: 158
Position: 53, peak value: 160
и тд

определит все Пики из массива, а Зенка return вернет только первый результат
 

alexwhite

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

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
если запустить C# на сайте rextester.com/IML43119 то выдаст вот такую композицию

Position: 2, peak value: 113
Position: 6, peak value: 127
Position: 11, peak value: 129
Position: 16, peak value: 132
Position: 20, peak value: 137
Position: 25, peak value: 145
Position: 30, peak value: 150
Position: 35, peak value: 151
Position: 39, peak value: 157
Position: 44, peak value: 162
Position: 49, peak value: 158
Position: 53, peak value: 160
и тд

определит все Пики из массива, а Зенка return вернет только первый результат

Попробовал добавить список и в список результаты, но что то опять косяк...

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

    project.Variables["Y"].Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(s => !string.IsNullOrWhiteSpace(s))
    .ToList()
    .ForEach(d => values.Add(double.Parse(d, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture)));
    List<string> listA = new List<string>();
    List<double> curInterval = new List<double>();

            bool decreasing = false;
            for (int i = 0; i < values.Count; i++)
            {
                if (curInterval.Count > 0)
                {
                    if (values[i] < curInterval.Last() && !decreasing)
                    {
                        listA.Add("Position: " + (i - 1).ToString() + ", peak value: " + curInterval.Last());
                        curInterval.Clear();
                        decreasing = true;
                        return listA;
                    }
                    else if (values[i] >= curInterval.Last() && decreasing)
                    {
                        decreasing = false;
                    }
                }
                curInterval.Add(values[i]);
            }
выдает :
Выполнение кода C# Результат: System.Collections.Generic.List`1[System.String]

вместо пиков...
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
Ошибка из-за return listA; удали эту строку вообще.
2. Не все результаты собираются, т.к. последнее значение в списке values, больше последнего значения в списке curInterval, поэтому последняя строка идет по else.
Тебе в else необходимо добавить условие проверки, если это последняя строка в values.
 

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
Воу Воу Воу! у меня получилось))

выкладываю рабочий код:

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

    project.Variables["Y"].Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(s => !string.IsNullOrWhiteSpace(s))
    .ToList()
    .ForEach(d => values.Add(double.Parse(d, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture)));
    var list = project.Lists["A"];
    List<double> curInterval = new List<double>();

            bool decreasing = false;
            for (int i = 0; i < values.Count; i++)
            {
                if (curInterval.Count > 0)
                {
                    if (values[i] < curInterval.Last() && !decreasing)
                    {
                        list.Add("Position: " + (i - 1).ToString() + ", peak value: " + curInterval.Last());
                        curInterval.Clear();
                        decreasing = true;
                    }
                    else if (values[i] >= curInterval.Last() && decreasing)
                    {
                        decreasing = false;
                    }
                }
                curInterval.Add(values[i]);
            }
Для того что бы заработало, создайте список А в проекте
 

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
Ошибка из-за return listA; удали эту строку вообще.
2. Не все результаты собираются, т.к. последнее значение в списке values, больше последнего значения в списке curInterval, поэтому последняя строка идет по else.
Тебе в else необходимо добавить условие проверки, если это последняя строка в values.
Почти что так же решил, спасибо, учту на будущее :-)

доб. Какое условие в пункте 2? напиши пожалуйста, потому что если даже список с цифрами увеличить, то действительно последняя строка не учитывается
 
Последнее редактирование:

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Принимает любой список строк с любыми числами
C#:
List<string> list = new List<string>()
{
    "93","113","113,3","75","50","94","127.8","118","63","62","111","129","105","49","77",
    "124","132","92","48","98","137","132","78","60","116","145","124","65","78","129",
    "150","113","58","97","146","151","94","62","113","157","143","73","73","134","162",
    "129","63","93","148","158","112","63","114","160","152","90","73","132","166","144",
    "73","89","150","167","126","67","110","161","164","105","69","128","168","155","82",
    "89","146","170","137","74","107","160","171","121","72","123","171","168","105","82",
    "144","173","155","82","100","160","176","139","78","120","168","172","114","78","136",
    "173","162","97","95","157","182","146","79","110","162","176","126","75","129","177",
    "167","103","85","147","175","152","86","103","158","174","132","75","117","166","170",
    "112","74","134","172","155","84","92","151","171","140","74","105","160"
};


System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("EN");

double last = 0;
bool decreasing = false;
for(int i = 0; i < list.Count; i++)
{
    double current = double.Parse(list[i].Replace(",", "."), culture);
    if(last > 0)
    {
        if(current < last && !decreasing)
        {
            project.SendInfoToLog("Position: " + (i - 1).ToString() + ", peak value: " + last.ToString());
            decreasing = true;
        }
        else if(current >= last && decreasing)
        {
            decreasing = false;
        }
    }
    last = current;   
}
 
  • Спасибо
Реакции: alexwhite

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
Принимает любой список строк с любыми числами
C#:
List<string> list = new List<string>()
{
    "93","113","113,3","75","50","94","127.8","118","63","62","111","129","105","49","77",
    "124","132","92","48","98","137","132","78","60","116","145","124","65","78","129",
    "150","113","58","97","146","151","94","62","113","157","143","73","73","134","162",
    "129","63","93","148","158","112","63","114","160","152","90","73","132","166","144",
    "73","89","150","167","126","67","110","161","164","105","69","128","168","155","82",
    "89","146","170","137","74","107","160","171","121","72","123","171","168","105","82",
    "144","173","155","82","100","160","176","139","78","120","168","172","114","78","136",
    "173","162","97","95","157","182","146","79","110","162","176","126","75","129","177",
    "167","103","85","147","175","152","86","103","158","174","132","75","117","166","170",
    "112","74","134","172","155","84","92","151","171","140","74","105","160"
};


System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("EN");

double last = 0;
bool decreasing = false;
for(int i = 0; i < list.Count; i++)
{
    double current = double.Parse(list[i].Replace(",", "."), culture);
    if(last > 0)
    {
        if(current < last && !decreasing)
        {
            project.SendInfoToLog("Position: " + (i - 1).ToString() + ", peak value: " + last.ToString());
            decreasing = true;
        }
        else if(current >= last && decreasing)
        {
            decreasing = false;
        }
    }
    last = current;  
}
кстати как и у меня не берется в расчет последнее значение...
 

RoyalBank

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

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

    project.Variables["Y"].Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(s => !string.IsNullOrWhiteSpace(s))
    .ToList()
    .ForEach(d => values.Add(double.Parse(d, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture)));
            List<double> curInterval = new List<double>();

            bool decreasing = false;
            for (int i = 0; i < values.Count; i++)
            {
                if (curInterval.Count > 0)
                {
                    if (values[i] < curInterval.Last() && !decreasing)
                    {
                        project.SendInfoToLog ("Position: " + (i).ToString() + ", peak value: " + curInterval.Last(),true);
                        curInterval.Clear();
                        decreasing = true;
                    }
                    else if (i + 1 == values.Count && values.Last() > curInterval.Last()) {
                        project.SendInfoToLog ("Position: " + (i + 1).ToString() + ", peak value: " + values.Last(),true);
                    }
                    else if (values[i] >= curInterval.Last() && decreasing)
                    {
                        decreasing = false;
                    }
                }
                curInterval.Add(values[i]);
            }
 
  • Спасибо
Реакции: alexwhite

alexwhite

Client
Регистрация
02.03.2009
Сообщения
107
Благодарностей
6
Баллы
18
Писал выше, необходимо добавить обработчик сценария для последней строки, перед else, вот код.
Теперь все работает как часы! Большое спасибо, с меня причитается :-)
 

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