Как написать следующий код на C#?

uRusure

Client
Регистрация
07.07.2018
Сообщения
40
Реакции
14
Баллы
8
Ребят, помогите пожалуйста, написать следующий код на C#.

Дано: Таблица с множеством строк и несколькими столбцами, в одном из которых "timestamp_unix" лежит значение в формате юникс времени (секунды) для каждой строки разные.

Необходимо: Проверять во всех строках столбец "timestamp_unix" который содержит разные юникс значения для каждой строки на то, прошло ли уже 900 секунд или больше с момента текущего юникс значения, если такая строка с таким значением есть, то брать из этой строки значение столбца "username" и класть это значение в переменную и после этого как-то помечать, что эта строка уже отработана. Я думаю можно писать в столбце "checked" типо true или false, чтобы эта строка больше не проверялась. (true - с этой строки уже брали "username"; false - с этой строки еще не брали значение "username"). Возможно вы знаете как лучше? Хотелось бы не создавать никаких дополнительных таблиц, а все делать в этой.


43498
 
C#:
Развернуть Свернуть Копировать
var table = project.Tables["Таблица 1"];
int timenow = int.Parse(project.Variables["timenow"].Value);
List<string> unix = table.GetColumn(2).ToList();
List<int> cor = new List<int>();
for(int tabi = 1 ; tabi < table.RowCount; tabi++) {
if(table.GetCell(3,tabi) != "yes") {
    for(int i = 1; i<unix.Count; i++)
    cor.Add(int.Parse(unix[i]));
    for(int j = 0 ; j < cor.Count; j++) {
        if(cor[j]-timenow > 900) {
            table.SetCell(3,j+1,"yes");
            return project.Variables["test"].Value = table.GetCell(1,j+1);
        }
        else {
            table.SetCell(3,j+1,"no");
            continue;
        }
    }
}
else continue;
}

2019-10-21_09-14-24.png

Почему-то не получилось сходу для всей таблицы применить. Я уверен что дело в полном цикле...

Я так понял пропущена логика, где надо все значения обрабатывать, а так мой берет только первое совпадение, которое удовлетворяет условию, и собственно return заканчивает цикл полностью. Не пойму только почему Проверка на != yes не сработала... Наверное тут лучше применить метод .Contains().... ща попробую..
 
  • Спасибо
Реакции: uRusure
C#:
Развернуть Свернуть Копировать
var table = project.Tables["Таблица 1"];
int intDateTimeNow = (int)DateTimeOffset.Now.ToUnixTimeSeconds();
for(int tabi = 0 ; tabi < table.RowCount; tabi++) {
if(table.GetCell(3,tabi) != "yes") {
    int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));
    if(intDateTimeNow - intTableTime > 900) {
        table.SetCell(3,tabi,"yes");
        project.SendInfoToLog(table.GetCell(1,tabi));
        project.Variables["user_name"].Value = table.GetCell(1,tabi);
       
        //здесь производим необходимые манипуляции с переменной и после этого продолжаем перебирать строки
       
        //break; //раскомментировать строку, если цикл нужно прервать и использовать переменную вне цикла
    }
    else {
        table.SetCell(3,tabi,"no");
        continue;
    }
}
else continue;
}
 
  • Спасибо
Реакции: uRusure
C#:
Развернуть Свернуть Копировать
var table = project.Tables["Таблица 1"];
int intDateTimeNow = (int)DateTimeOffset.Now.ToUnixTimeSeconds();
for(int tabi = 0 ; tabi < table.RowCount; tabi++) {
if(table.GetCell(3,tabi) != "yes") {
    int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));
    if(intDateTimeNow - intTableTime > 900) {
        table.SetCell(3,tabi,"yes");
        project.SendInfoToLog(table.GetCell(1,tabi));
        project.Variables["user_name"].Value = table.GetCell(1,tabi);
      
        //здесь производим необходимые манипуляции с переменной и после этого продолжаем перебирать строки
      
        //break; //раскомментировать строку, если цикл нужно прервать и использовать переменную вне цикла
    }
    else {
        table.SetCell(3,tabi,"no");
        continue;
    }
}
else continue;
}
Спасибо большое, сейчас затесчу.
 
C#:
Развернуть Свернуть Копировать
var table = project.Tables["Таблица 1"];
int intDateTimeNow = (int)DateTimeOffset.Now.ToUnixTimeSeconds();
for(int tabi = 0 ; tabi < table.RowCount; tabi++) {
if(table.GetCell(3,tabi) != "yes") {
    int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));
    if(intDateTimeNow - intTableTime > 900) {
        table.SetCell(3,tabi,"yes");
        project.SendInfoToLog(table.GetCell(1,tabi));
        project.Variables["user_name"].Value = table.GetCell(1,tabi);
      
        //здесь производим необходимые манипуляции с переменной и после этого продолжаем перебирать строки
      
        //break; //раскомментировать строку, если цикл нужно прервать и использовать переменную вне цикла
    }
    else {
        table.SetCell(3,tabi,"no");
        continue;
    }
}
else continue;
}
Не пойму в чем проблема, но при попытке выполнить кубик с этим кодом выдает такую ошибку :(
43593
 
код отрабатывает нормально. ищи ошибку в проекте. ты к таблице привязался? "первая сторока - заголовки" галку поставил?
1571874122050.png
 
код отрабатывает нормально. ищи ошибку в проекте. ты к таблице привязался? "первая строка - заголовки" галку поставил?
Посмотреть вложение 43613
Да, у меня все стоит правильно. Ошибку методом перебора нашел в 5 строке кода. Исправил с "int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));" на "int intTableTime = int.Parse(table.GetCell(2,tabi));".

Но есть еще одна проблема, которую мне так и не удалось решить. Это если условие не выполняется, то есть пока еще не прошло более 15 минут ни для одной из строк, либо все строки уже отработаны (то есть имеют status "yes"), то в этом случае не получается завершить кубик по красной линии. Хотя я пытался в самом конце после закрывающей фигурной скобки дописать: "throw new Exception("Все строки отработаны, либо еще не прошло 15 мин");", но в этом случае даже если главное условие выполняется, то кубик все-равно завершается по красной линии :(
 
Исправил с "int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));" на "int intTableTime = int.Parse(table.GetCell(2,tabi));".
хм ... непонятно почему у тебя Convert не работает

Но есть еще одна проблема, которую мне так и не удалось решить
попробуй так
C#:
Развернуть Свернуть Копировать
var table = project.Tables["Таблица 1"];
int intDateTimeNow = (int)DateTimeOffset.Now.ToUnixTimeSeconds();
int intStatus=0;
for(int tabi = 0 ; tabi < table.RowCount; tabi++) {
    if(table.GetCell(3,tabi) != "yes") {
        int intTableTime = Convert.ToInt32(table.GetCell(2,tabi));
        if(intDateTimeNow - intTableTime > 900) {
            table.SetCell(3,tabi,"yes");
            project.SendInfoToLog(table.GetCell(1,tabi));
            project.Variables["user_name"].Value = table.GetCell(1,tabi);
       
            //здесь производим необходимые манипуляции с переменной и после этого продолжаем перебирать строки
       
            //break; //раскомментировать строку, если цикл нужно прервать и использовать переменную вне цикла
        }
        else {
            intStatus++;
            table.SetCell(3,tabi,"no");
            continue;
        }
    }
    else{
        intStatus++;
        continue;
    }
}
if(intStatus==table.RowCount){
    throw new Exception("Все строки отработаны, либо еще не прошло 15 мин");
}
 
  • Спасибо
Реакции: uRusure

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