C#排序列表顺序错误 - 日期时间

时间:2014-02-03 15:03:26

标签: c# datetime sortedlist

任何帮助都会被贬低。我只是一个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

它应该是eventStartTime 0 - &gt;事件EndTime 1,依此类推。


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#并且已经尝试了很多东西来解决这个问题,但是我不确定为什么月份的变化会像这样敲定排序列表顺序,(特别是在日期时间)任何帮助都会非常地理解????

令人难以置信的沮丧!

1 个答案:

答案 0 :(得分:2)

避免渲染和解析日期,只需留在日期对象上并使用简单的比较器,例如<>

DateTime eventStartTime = eventStart.GetByIndex(eventCheckInt);
DateTime eventEndTime = eventEnd.GetByIndex(startSortInt);

if(eventEndTime < eventStartTime)
{
    // here you've detected an error
}