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

  • Автор темы Автор темы alexwhite
  • Дата начала Дата начала

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]);
            }
 

Вложения

Последнее редактирование:
Замени в цикле double на int
C#:
Развернуть Свернуть Копировать
for (int i = 0; i < values.Count; i++)
 
  • Оценить
Реакции: alexwhite
Замени в цикле double на int
C#:
Развернуть Свернуть Копировать
for (int i = 0; i < values.Count; i++)
Спасибо! Заработало)))

а по второму пункту можешь подсказать, как вывести все пики? а то выходит только один результат
 
Опиши подробно свою задачу.
если запустить 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# на сайте 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]

вместо пиков...
 
Ошибка из-за return listA; удали эту строку вообще.
2. Не все результаты собираются, т.к. последнее значение в списке values, больше последнего значения в списке curInterval, поэтому последняя строка идет по else.
Тебе в else необходимо добавить условие проверки, если это последняя строка в values.
 
Воу Воу Воу! у меня получилось))

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

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]);
            }
Для того что бы заработало, создайте список А в проекте
 
Ошибка из-за return listA; удали эту строку вообще.
2. Не все результаты собираются, т.к. последнее значение в списке values, больше последнего значения в списке curInterval, поэтому последняя строка идет по else.
Тебе в else необходимо добавить условие проверки, если это последняя строка в values.
Почти что так же решил, спасибо, учту на будущее :-)

доб. Какое условие в пункте 2? напиши пожалуйста, потому что если даже список с цифрами увеличить, то действительно последняя строка не учитывается
 
Последнее редактирование:
Принимает любой список строк с любыми числами
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
Принимает любой список строк с любыми числами
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;  
}

кстати как и у меня не берется в расчет последнее значение...
 
кстати как и у меня не берется в расчет последнее значение...
Писал выше, необходимо добавить обработчик сценария для последней строки, перед 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

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