检查时间顺序并返回无序行

时间:2012-08-10 17:37:37

标签: c#

这是一个小逻辑问题。我的数据网格按时间顺序包含日期时间值。 如果用户输入了无序日期时间,程序应突出显示无序行。 例如:这是初始订单。

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是用户定义的日期时间值数组。 pSeriespData属于DataArray类型。 所以,当我说pdata[np - 1].DateTime时,它指的是日期时间单元格。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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,那么我们继续将您现有的代码作为辅助测试。

测试此方法的一种更简单的方法是检查每个行日期是否大于或等于上一行日期。每行只有一个比较而不是两个+。当您到达未通过此测试的行日期时,您需要“环顾四周”以确定“责备”是与前一行还是当前行。这个“环顾四周”代码的速度并不重要,因为它只会在错误情况下使用。