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

4

2 回答 2

0

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

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

于 2012-08-10T18:03:53.720 回答
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,那么我们将继续使用您现有的代码作为辅助测试。

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

于 2012-08-10T18:29:37.193 回答