C#排序列表顺序出现错误-日期时间
任何帮助都将不胜感激。我只是一个c#初学者,不幸的是继承了一个c#应用程序,它使用xmlreader根据模式验证xml文件,标记各种错误,例如xml文件中的重叠“事件”(日期) 包含2个事件的xml文件示例(这一个会正确地标记一个错误,表示事件重叠,因为PT45M的sched持续时间超过了下一个18:30的schedstarttime。): 然后使用datetimecompare代码对其进行VAIDatate:C#排序列表顺序出现错误-日期时间,c#,datetime,sortedlist,C#,Datetime,Sortedlist,任何帮助都将不胜感激。我只是一个c#初学者,不幸的是继承了一个c#应用程序,它使用xmlreader根据模式验证xml文件,标记各种错误,例如xml文件中的重叠“事件”(日期) 包含2个事件的xml文件示例(这一个会正确地标记一个错误,表示事件重叠,因为PT45M的sched持续时间超过了下一个18:30的schedstarttime。): 然后使用datetimecompare代码对其进行VAIDatate: public int checkEventValidatity(int i)
public int checkEventValidatity(int i)
{
{
int startSortInt = eventStart.IndexOfValue(getStartEventArrayValue(i));
//Variable get the number of Events in the file
int length = getEventStartLength() - 1;
int nextEvent = i + 1;
//Resets the methods vairables
resetVariable();
//There is no need to check the first event
if (i != length)
{
//Variable to hold the next event index
int eventCheckInt = eventStart.IndexOfValue(getStartEventArrayValue((nextEvent)));
//Checks the event start time and end time are in the is in the time frame of the xml file
if (checkInTimeFrame(startSortInt) == true)
{
String eventStartTime = eventStart.GetByIndex(eventCheckInt).ToString();
//eventstartime is next event (eventcheckint)index puts to string eventStartTime
String eventEndTime = eventEnd.GetByIndex(startSortInt).ToString();
int j = DateTime.Compare(DateTime.Parse(eventEndTime), DateTime.Parse((eventStartTime)));
this.setEventInvalidLineNo1((int)eventEnd.GetKey(startSortInt));
this.setEventInvalidLineNo2((int)eventEnd.GetKey(eventCheckInt));
validEvent = 1;
setEventError(j);
Debug.WriteLine("EventStarttime " + eventStartTime + " " startSortInt); //Test output
Debug.WriteLine("EventEndTime " + eventEndTime + " " eventCheckInt); //Test Output
Debug.WriteLine("EventEnd " + eventEnd); //Test Output
}
//Debug.WriteLine(j);
}
}
调试器显示以下输出,表明排序后的列表未按顺序进行验证,第二天的事件9用作第一个事件,这会使所有事件失去同步并返回错误:
这是
Debug.WriteLine("EventStarttime " + eventStartTime); //Test output
Debug.WriteLine("EventEndTime " + eventEndTime); //Test Output
xml文件持续时间2014年1月31日-2014年2月1日-按错误顺序排序的列表,事件9应该是最后一个 2014年2月1日16:00:00的名单实际上是在2014年1月31日18:30:00(18:00:00)之前订购的 应跳过事件。) 事件开始时间2014年2月1日16:00:00 9 事件结束时间2014年1月31日18:30:00 事件开始时间2014年1月31日18:00:00 事件结束时间2014年1月31日19:00:00 1 事件开始时间2014年1月31日18:30:00 1 事件结束时间2014年1月31日19:30:00 2 事件开始时间2014年1月31日19:00:00 2 事件结束时间2014年1月31日20:00:00 3 事件开始时间2014年1月31日19:30:00 3 事件结束时间2014年1月31日20:30:00 4 事件开始时间2014年1月31日20:00:00 4 事件结束时间2014年1月31日21:00:00 5 事件开始时间2014年1月31日20:30:00 5 事件结束时间2014年1月31日21:30:00 6 事件开始时间2014年1月31日21:00:00 6 事件结束时间2014年1月31日22:00:00 7 事件开始时间2014年1月31日21:30:00 7 事件结束时间2014年2月1日17:00:00 8 它应该是eventStartTime 0->event EndTime 1,依此类推。
Xml文件持续时间2014年1月1日至2014年1月2日-无问题-一切正常 事件开始时间2014年1月1日18:30:00 0 EventEndTime 2014年1月1日18:30:00 1 事件开始时间2014年1月1日19:00:00 1 事件结束时间2014年1月1日19:00:00 2 事件开始时间2014年1月1日19:30:00 2 事件结束时间2014年1月1日19:30:00 3 事件开始时间2014年1月1日20:00:00 3 EventEndTime 2014年1月1日20:00:00 4 事件开始时间2014年1月1日20:30:00 4 事件结束时间2014年1月1日20:30:00 5 事件开始时间2014年1月1日21:00:00 5 事件结束时间2014年1月1日21:00:00 6 事件开始时间2014年1月1日21:30:00 6 事件结束时间2014年1月1日21:30:00 7 事件开始时间2014年1月1日22:00:00 7 事件结束时间2014年1月1日22:00:00 8 ……等等。即使是在2014年1月1日至2014年1月2日的第二天,datetime的订单仍然完美无瑕
这是什么原因造成的?我只是在学习c#,并且已经尝试了很多方法来解决这个问题,但是我不确定为什么月份的变化会像这样打乱已排序的列表顺序(特别是在datetime中),任何帮助都将非常感谢
真令人沮丧 避免渲染和解析日期,只需停留在日期对象上,并使用简单的比较器,如
:
DateTime eventStartTime=eventStart.GetByIndex(eventCheckInt);
DateTime eventEndTime=eventEnd.GetByIndex(startSortInt);
if(eventEndTime
您不显示生成输出的内容。你所使用的循环的完整代码是什么?@opalenzuela-我不明白,事件9从1月开始,到2月结束——你在说什么?EventStarttime 01/02/2014 16:00:00
9EventEndTime 31/01/2014 18:30:00
->我想这是事件9,对吗?是的,事件9是最后一个事件,从2014年2月1日开始(年月日)。这应该是事件8之后的最后一次验证,但它似乎非常重要,因此排除了所有其他内容。我确实在其他地方读到,将datetime转换为字符串然后再返回可能是这个问题的途径,我认为下面的PID方法避免了这一点。感谢迄今为止的帮助伙计们。我尝试了上述方法,但受到了对象排序的影响GetByIndex(int Index)无法将对象复杂地转换为系统日期时间。是否缺少强制转换?
public int checkEventValidatity(int i)
{
{
int startSortInt = eventStart.IndexOfValue(getStartEventArrayValue(i));
//Variable get the number of Events in the file
int length = getEventStartLength() - 1;
int nextEvent = i + 1;
//Resets the methods vairables
resetVariable();
//There is no need to check the first event
if (i != length)
{
//Variable to hold the next event index
int eventCheckInt = eventStart.IndexOfValue(getStartEventArrayValue((nextEvent)));
//Checks the event start time and end time are in the is in the time frame of the xml file
if (checkInTimeFrame(startSortInt) == true)
{
String eventStartTime = eventStart.GetByIndex(eventCheckInt).ToString();
//eventstartime is next event (eventcheckint)index puts to string eventStartTime
String eventEndTime = eventEnd.GetByIndex(startSortInt).ToString();
int j = DateTime.Compare(DateTime.Parse(eventEndTime), DateTime.Parse((eventStartTime)));
this.setEventInvalidLineNo1((int)eventEnd.GetKey(startSortInt));
this.setEventInvalidLineNo2((int)eventEnd.GetKey(eventCheckInt));
validEvent = 1;
setEventError(j);
Debug.WriteLine("EventStarttime " + eventStartTime + " " startSortInt); //Test output
Debug.WriteLine("EventEndTime " + eventEndTime + " " eventCheckInt); //Test Output
Debug.WriteLine("EventEnd " + eventEnd); //Test Output
}
//Debug.WriteLine(j);
}
}
Debug.WriteLine("EventStarttime " + eventStartTime); //Test output
Debug.WriteLine("EventEndTime " + eventEndTime); //Test Output
DateTime eventStartTime = eventStart.GetByIndex(eventCheckInt);
DateTime eventEndTime = eventEnd.GetByIndex(startSortInt);
if(eventEndTime < eventStartTime)
{
// here you've detected an error
}