2012-08-10 156 views
0

这是一个小逻辑问题。我的数据网格按时间顺序包含日期时间值。 如果用户输入无序日期时间,程序应该突出显示无序的行。 例如:这是最初的订单。查看时间顺序并返回错误排

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它指的是日期时间单元格。

+0

看看“正则表达式”类,它应该能够解决您的问题。 – dotTutorials 2012-08-10 17:42:41

+0

是不是正则表达式类用于匹配模式?你有没有例子? – user1580726 2012-08-10 17:50:16

回答

0

您的代码表示,用于序列(A,C,B,d),C被认为是不按顺序,因为C没有A和B.

之间落入在序列的情况下(5.0, 6.0,5.1,7.0),你当前的代码会发现6.0不适合5.0和5.1,因此6.0不合适。不过,您的问题描述表明您有另一个标准来决定某行是否不在您的代码中表示的位置。

我会猜测附加规则是这样的:如果N + 1适合N-1和N之间,那么N + 1是不合适的行,而不是N行。

对于序列(5.0,6.0,5.1,7.0),如果我们首先测试这个新规则,那么它将5.1标记为不合适的行。如果新规则返回false,那么我们继续将现有代码作为辅助测试。

也许一个简单的方法来测试这是检查每个行日期大于或等于上一行日期。只需要比较每行而不是两个+。当您达到测试失败的行日期时,您需要“环顾四周”以确定“责备”是与前一行还是与当前行一起。这个“环视”代码的速度有多快并不重要,因为它仅用于错误情况。

0

您需要更精确地定义什么构成乱序条目。如果我输入日期{A,C,B},你会认为C不合适,因为它应该在B之后,或B不合适,因为它应该在C之前?

重读您的问题后,听起来用户一次只能输入一个日期,并且您应该在每次新条目后检查有效的订单。这简化了一些事情。您应该找到用户输入的日期,然后将其与前后列表中的日期进行比较。如果它不在该范围内,请突出显示新的日期。现在,您正在检查每个条目的正确范围,因此如果您晚于条目列入条目,那么之前的条目将被视为不正确。如果您早于应该将条目放入列表中,您的算法就可以工作。