任何帮助都会被贬低。我只是一个c#初学者,不幸的是继承了一个c#app,它使用xmlreader来验证模式的xml文件,标记各种错误,例如xml文件中重叠的'events'(日期)。
包含2个事件的xml文件示例(这个事件会正确地标记错误,说明事件重叠,因为PT45M的扫描持续时间超过了下一个18:30的schedstarttime。):
<TimePeriod startTime="2014-01-31T18:00:00+00:00" endTime="2014-02-01T18:00:00+00:00"/> (Whole time of all xml file events)
<ScheduleEvent eventId="0019" schedStartTime="2014-01-31T18:00:00+00:00" schedDuration="PT45M"
billedStartTime="2014-01-31T18:00:00+00:00"
billedDuration="PT30M">
<ScheduleEvent eventId="001a" schedStartTime="2014-01-31T18:30:00+00:00" schedDuration="PT30M"
billedStartTime="2014-01-31T18:30:00+00:00"
billedDuration="PT30M">
等...
这一切都很有效,直到引入超过一个月边界的XML文件 - 例如,时间段的事件从2014年1月31日到2014年2月1日(所有时间都是UTC)。第二天的事件将作为重叠错误返回。使用已排序列表读取事件:
public void setEventStart(DateTime eventStartIn, int lineNumber)
{
eventStart.Add(lineNumber,eventStartIn.ToString());
}
public SortedList getEventStart()
{
return eventStart;
}
public void setBillStart(DateTime eventStartIn, int lineNumber)
{
billStart.Add(lineNumber, eventStartIn.ToString());
}
public SortedList getBillStart()
{
return billStart;
}
public void setEventOutOfTimeFrame(int inLineNumber)
{
eventOutOfTimeFrame = inLineNumber;
}
然后使用datetimecompare代码进行调用:
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 file duration 31/01/2014 - 01/02/2014 - 以错误的顺序排序列表,事件9应该是最后的 在01/02/2014 16:00:00的名单实际上是在真正的拳头事件之前订购31/01/2014 18:30:00(18:00:00) 应该跳过事件。)
EventStarttime 01/02/2014 16:00:00 9 EventEndTime 31/01/2014 18:30:00 0
EventStarttime 31/01/2014 18:00:00 0 EventEndTime 31/01/2014 19:00:00 1
EventStarttime 31/01/2014 18:30:00 1 EventEndTime 31/01/2014 19:30:00 2
EventStarttime 31/01/2014 19:00:00 2 EventEndTime 31/01/2014 20:00:00 3
EventStarttime 31/01/2014 19:30:00 3 EventEndTime 31/01/2014 20:30:00 4
EventStarttime 31/01/2014 20:00:00 4 EventEndTime 31/01/2014 21:00:00 5
EventStarttime 31/01/2014 20:30:00 5 EventEndTime 31/01/2014 21:30:00 6
EventStarttime 31/01/2014 21:00:00 6 EventEndTime 31/01/2014 22:00:00 7
EventStarttime 31/01/2014 21:30:00 7 EventEndTime 01/02/2014 17:00:00 8
Xml文件持续时间01/01/2014至02/01/2014 - 无问题 - 全部按顺序
EventStarttime 01/01/2014 18:30:00 0 EventEndTime 01/01/2014 18:30:00 1
EventStarttime 01/01/2014 19:00:00 1 EventEndTime 01/01/2014 19:00:00 2
EventStarttime 01/01/2014 19:30:00 2 EventEndTime 01/01/2014 19:30:00 3
EventStarttime 01/01/2014 20:00:00 3 EventEndTime 01/01/2014 20:00:00 4
EventStarttime 01/01/2014 20:30:00 4 EventEndTime 01/01/2014 20:30:00 5
EventStarttime 01/01/2014 21:00:00 5 EventEndTime 01/01/2014 21:00:00 6
EventStarttime 01/01/2014 21:30:00 6 EventEndTime 01/01/2014 21:30:00 7
EventStarttime 01/01/2014 22:00:00 7 EventEndTime 01/01/2014 22:00:00 8
......等等。即使在第二天01/01/2014 - 2014年1月2日进入第二天,仍然可以完美地订购日期时间。
是什么导致这个?我只是在学习c#并且已经尝试了很多东西来解决这个问题,但是我不确定为什么月份的变化会像这样敲定排序列表顺序,(特别是在日期时间)任何帮助都会非常地理解????
令人难以置信的沮丧!
答案 0 :(得分:2)
避免渲染和解析日期,只需留在日期对象上并使用简单的比较器,例如<
和>
:
DateTime eventStartTime = eventStart.GetByIndex(eventCheckInt);
DateTime eventEndTime = eventEnd.GetByIndex(startSortInt);
if(eventEndTime < eventStartTime)
{
// here you've detected an error
}