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

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)

任何帮助都将不胜感激。我只是一个c#初学者,不幸的是继承了一个c#应用程序,它使用xmlreader根据模式验证xml文件,标记各种错误,例如xml文件中的重叠“事件”(日期)

包含2个事件的xml文件示例(这一个会正确地标记一个错误,表示事件重叠,因为PT45M的sched持续时间超过了下一个18:30的schedstarttime。):

然后使用datetimecompare代码对其进行VAIDatate:

  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
9
EventEndTime 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
}