Найти ближайшее совпадение в таблице C#

baimkin

Client
Регистрация
04.08.2015
Сообщения
283
Благодарностей
111
Баллы
43
Добрый день!
Помогите с кодом, чет не получается сделать весь.
Нужно к определенной переменной найти ближайшее совпадение в пределах +-50 в столбце таблицы(это получается), далее если данное совпадение найдено, то посмотреть по значению в найденной ячейке есть ли так же совпадение в пределах +- 50, если есть то продолжить поиск, если нету, то вывести номер последней найденной строки. Если вообще ничего нет, то просто выйти из кода.

Код с нахождением ближайшего совпадения(работает):
Код:
// изначальное значение переменной для сравнения
var per = Convert.ToInt32(project.Variables["per1"].Value);
// получаем таблицу, в которой будем искать сравнения
var sourceTable = project.Tables["table1"];
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        var m = Convert.ToInt32(sourceTable.GetCell(0,i).ToString());
        if (Math.Abs(per-m) < 50){
        return i;
        }
    }
}
// если ничего не нашли
return "no";
Код с поиском всех вхождений начиная с заданного значения(не работает):
Код:
// изначальное значение переменной для сравнения
var per = Convert.ToInt32(project.Variables["per1"].Value);
// получаем таблицу, в которой будем искать сравнения
var sourceTable = project.Tables["table1"];
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        for (var m = Convert.ToInt32(sourceTable.GetCell(0,i).ToString()); Math.Abs(per-m) < 50; m = Convert.ToInt32(sourceTable.GetCell(0,i).ToString()) ){
    per= m;
        }
        return i;
    }
}
// если ничего не нашли
return "no";
 
Последнее редактирование:

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
Второй код не работает, так как в 10 строке ужас какой-то.
Задача не совсем понятна
то посмотреть по значению в найденной ячейке есть ли так же совпадение в пределах +- 50, если есть то продолжить поиск
Есть ли совпадение где? В любой ячейке столбца, или ближайшей ячейке столбца по отношению к найденной? "Если есть то продолжить поиск" чего, и до какого результата?
 

tka4enko.ilya

Client
Регистрация
20.10.2015
Сообщения
61
Благодарностей
9
Баллы
8
А во второй цикл программа заходит?
Может стоит использовать другой тип цикла?
while
 

baimkin

Client
Регистрация
04.08.2015
Сообщения
283
Благодарностей
111
Баллы
43
Вот так постарался более наглядно описать, и добавил общее условие, которое до этого сам не видел.
upload_2016-10-11_14-32-35.png
 

baimkin

Client
Регистрация
04.08.2015
Сообщения
283
Благодарностей
111
Баллы
43
Второй код не работает, так как в 10 строке ужас какой-то.
Задача не совсем понятна
Есть ли совпадение где?
Поиск по таблице же сделан.
Код:
// получаем таблицу, в которой будем искать сравнения
var sourceTable = project.Tables["table1"];
В любой ячейке столбца, или ближайшей ячейке столбца по отношению к найденной?
Первое найденное значение в 0 столбце пределах +-50
Код:
m = Convert.ToInt32(sourceTable.GetCell(0,i).ToString()); Math.Abs(per-m) < 50;
"Если есть то продолжить поиск" чего, и до какого результата?
то посмотреть по значению в найденной ячейке есть ли так же совпадение в пределах +- 50, т.е по ближайшему совпадению в заданном пределе.
и до какого результата?
до результата когда перестанет находится значение в заданном интервале и вывести номер последней найденной строки.
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
927
Баллы
93
Вот так постарался более наглядно описать, и добавил общее условие, которое до этого сам не видел.
Код:
// изначальное значение переменной для сравнения
var per = Convert.ToInt32(project.Variables["per1"].Value);
// получаем таблицу, в которой будем искать сравнения
var sourceTable = project.Tables["table1"];
// переменная количества строк
int rowCount = sourceTable.RowCount;
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
    for(int i=0; i < rowCount; i++)
    {
        var m = Convert.ToInt32(sourceTable.GetCell(0,i).ToString());
        if (Math.Abs(per-m) < 50){
            per = m;
            rowCount = i;
            i = 0;
        }
    }
}
if (rowCount==sourceTable.RowCount)
    return "no";
else
    return rowCount;
Должно работать.
 
  • Спасибо
Реакции: baimkin

baimkin

Client
Регистрация
04.08.2015
Сообщения
283
Благодарностей
111
Баллы
43
да, работает, спасибо большое!
 

serg1208

Client
Регистрация
17.04.2018
Сообщения
331
Благодарностей
15
Баллы
18
Код:
// изначальное значение переменной для сравнения
var per = Convert.ToInt32(project.Variables["per1"].Value);
// получаем таблицу, в которой будем искать сравнения
var sourceTable = project.Tables["table1"];
// переменная количества строк
int rowCount = sourceTable.RowCount;
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
    for(int i=0; i < rowCount; i++)
    {
        var m = Convert.ToInt32(sourceTable.GetCell(0,i).ToString());
        if (Math.Abs(per-m) < 50){
            per = m;
            rowCount = i;
            i = 0;
        }
    }
}
if (rowCount==sourceTable.RowCount)
    return "no";
else
    return rowCount;
Должно работать.
не работает. Ошибка с входной строкой
 

artur23

Client
Регистрация
14.04.2014
Сообщения
202
Благодарностей
15
Баллы
18
Код:
// изначальное значение переменной для сравнения
var per = Convert.ToInt32(project.Variables["per1"].Value);
// получаем таблицу, в которой будем искать сравнения
var sourceTable = project.Tables["table1"];
// переменная количества строк
int rowCount = sourceTable.RowCount;
// ищем в каждой строчке в таблице
lock(SyncObjects.TableSyncer)
{
    for(int i=0; i < rowCount; i++)
    {
        var m = Convert.ToInt32(sourceTable.GetCell(0,i).ToString());
        if (Math.Abs(per-m) < 50){
            per = m;
            rowCount = i;
            i = 0;
        }
    }
}
if (rowCount==sourceTable.RowCount)
    return "no";
else
    return rowCount;
Должно работать.
не работает.
 

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