这是一个小的逻辑问题。我的数据网格具有按时间顺序排列的日期时间值。如果用户输入了无序的日期时间,程序应突出显示无序的行。例如:这是初始订单。
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是out或order行。但该程序突出了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单元格。
发布于 2012-08-11 02:29:37
你的代码说,对于一个序列(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,那么我们将继续使用您现有的代码作为辅助测试。
也许更简单的测试方法是检查每个行日期是否大于或等于前一行日期。每行只有一次比较,而不是two+。当您到达未通过此测试的行日期时,您需要“环顾四周”来决定“错误”是与前一行还是与当前行一起。这个“环视”代码的速度有多快并不重要,因为它只会在出错的情况下使用。
发布于 2012-08-11 02:03:54
您需要更精确地定义失序条目的构成。如果我输入日期{A,C,B},你会认为C不合适,因为它应该在B之后,或者B不合适,因为它应该在C之前?
在重新阅读您的问题后,听起来用户一次只能输入一个日期,并且您应该在每次新输入后检查有效的订单。这稍微简化了一些事情。您应该找到用户输入的日期,然后将其与列表中该日期之前和之后的日期进行比较。如果不在该范围内,则突出显示新日期。现在您正在检查每个条目的正确范围,所以如果您将一个条目放到列表中的时间比它应该晚,那么它之前的条目将被pinged为不正确。如果你在列表中提前放入一个条目,你的算法就会起作用。
https://stackoverflow.com/questions/11906616
复制相似问题