2012-08-10 3 views
0

Это небольшой логический вопрос. Мой datagrid имеет значения даты в хронологическом порядке. Если пользователь вводит время отсутствия порядка, программа должна выделить строку, которая не соответствует порядку. Например: Это начальный заказ.Проверить хронологический порядок и вернуть строку не в порядке

10/5/2010 11:59:59 
10/6/2010 00:00:00 
10/6/2010 11:59:59 

Предположим, что пользователь вводит

10/5/2010 11:59:59 
    ***10/7/2010 00:00:00***  
    10/6/2010 11:59:59 
    10/7/2010 00:00:00 

здесь 10/7/2010 00:00:00 является непригодной и программа корректно ведет себя.

Предположим, что пользователь вводит

10/5/2010 11:59:59 
10/6/2010 00:00:00 
***10/5/2010 11:59:59*** 
10/7/2010 00:00:00 

Здесь 10/5/2010 11:59:59 есть вне или порядок строк. Но программа выделяет 10/6/2010 00:00:00.

Вот мой код, чтобы проверить выше:

for (int nRow = 1; nRow < pSeries.Count; ++nRow) 
{ 
    // validation1 
    if (!check_range(nRow, i, pSeries[nRow].tim)) 
    { 
     row = nRow; 
     err = (short)err_typ.e_out_range; 
     goto err_exit; 
    } 
} 

public bool check_range(int np, int nCol, DateTime dt) 
{ 
    DataArray pdata = GetDataArray(nCol); 

    bool valid = (np <= 0 || pdata[np - 1].Datetim <= dt) && 
     (np >= (pdata.Count - 1) || dt <= pdata[np + 1].Datetim); 
    return valid; 
} 

DataArray это определяется пользователем массив значений даты и времени. pSeries, pData имеют тип DataArray. Итак, когда я говорю pdata[np - 1].DateTime, это относится к ячейке datetime.

+0

Загляните в класс «Regex», он должен уметь исправить вашу проблему. – dotTutorials

+0

Разве класс Regex не используется для соответствия паттернам? У вас есть примеры? – user1580726

ответ

0

Ваш код говорит, что для последовательности (А, С, В, D), С считается не по порядку, так как С не падает между А и В.

В случае последовательности (5.0, 6.0, 5.1, 7.0), ваш текущий код найдет, что 6.0 не подходит между 5.0 и 5.1, и поэтому 6.0 неуместен. Однако ваше описание проблемы указывает на то, что у вас есть другой критерий для определения того, является ли строка неуместной, которая не представлена ​​в вашем коде.

Я собираюсь предположить, что дополнительное правило что-то вроде этого: если N + 1 соответствует между N-1 и N, то N + 1 является строка, неуместна, а не грести Н.

Для последовательности (5.0, 6.0, 5.1, 7.0), если мы сначала проверим это новое правило, тогда оно будет обозначаться как неуместная строка 5.1. Если новое правило возвращает false, мы продолжаем использовать существующий код в качестве вторичного теста.

Возможно, более простой способ проверить это - проверить, что каждая дата строки больше или равна дате предыдущей строки. Только одно сравнение за строку вместо двух +. Когда вы достигаете даты строки, которая терпит неудачу в этом тесте, вам нужно «осмотреться», чтобы решить, «виноват ли» в предыдущей строке или текущей строке.Неважно, насколько быстро этот «оглядеться», потому что он будет использоваться только в ситуации с ошибкой.

0

Вам необходимо более точно определить, что представляет собой недействительный порядок. Если я поставил даты {A, C, B}, вы бы считали, что C неуместен, потому что он должен появиться после того, как B или B неуместны, потому что это должно быть до C?

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

Смежные вопросы