Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按对象内部的DateTime变量对ArrayList中的对象进行排序_C#_Datetime_Arraylist - Fatal编程技术网

C# 按对象内部的DateTime变量对ArrayList中的对象进行排序

C# 按对象内部的DateTime变量对ArrayList中的对象进行排序,c#,datetime,arraylist,C#,Datetime,Arraylist,我有个问题 我有一个对象的数组列表。每个对象都包含一个日期时间数据字段 我需要按此日期时间数据字段对此ArrayList进行排序 这是我的当前代码,不起作用: for (int i = 0;i<EventHolder.Count;i++) { Event obj = (Event) EventHolder[i]; try { obj2=(Event)Eve

我有个问题

我有一个对象的数组列表。每个对象都包含一个日期时间数据字段

我需要按此日期时间数据字段对此ArrayList进行排序

这是我的当前代码,不起作用:

        for (int i = 0;i<EventHolder.Count;i++)
        {
            Event obj = (Event) EventHolder[i];
            try
            {
                obj2=(Event)EventHolder[i+1];
            }
            catch
            {
                break;
            }
            DateTime date1 = DateTime.ParseExact(obj.Date_And_Time,"dd/MM/yyyy HH:mm",region);
            DateTime date2 = DateTime.ParseExact(obj2.Date_And_Time, "dd/MM/yyyy HH:mm", region);
            if (DateTime.Compare(date1,date2)>0)
            {
                Event tempobj=obj2;
                EventHolder[i+1]=obj;
                EventHolder[i]=tempobj;
            }
        }
        foreach (Event i in EventHolder)
        {
            Console.WriteLine(i.Date_And_Time);
        }
        Console.ReadLine();
我使用这3个日期来测试它是否有效:

2011年11月23日12:15

2010年6月28日04:05

1992年9月2日03:54

输出总是:

2010年6月28日04:05

1992年9月2日03:54

2011年11月23日12:15

我尝试使用>和<运算符进行比较,得到了相同的结果。我还尝试使用不同的命令将字符串转换为DateTime对象,如convert.ToDateTime、DateTime.Parse。尝试在没有HH:mm的情况下输入,相应地调整了代码,仍然有相同的输出。我尝试不使用IFormatProvider将其设置为null,但又一无所获

我偶然发现了这条线索:

我从对象中提取了所有日期,并将它们放入这个日期时间列表中。使用List.Sort并生成正确的输出。但后来我被困在如何使用这个排序列表来排序我的EventHolder ArrayList。我敲这面墙已经有一段时间了,没有结果

我对编程非常陌生,所以我几乎不知道如何做我正在做的事情。它甚至不起作用。 有人能告诉我哪里出了问题吗?

使用ArrayList.Sort重载-每次比较对象时都会收到一个回调,然后可以轻松比较对象中的两个日期

public class MyDateComparer : IComparer
{
    int IComparer.Compare ( Object x, Object y )
    {
        // Cast x and y to your object type and then compare the dates. Return
        // -1, 0 or 1 depending on your comparison
        return ( ... );
    }
}

...

myList.Sort ( 0, myList.Length, new MyDateComparer () );

在国际海事组织,这是一种错误的方法,更好的方法是使用


你要做的是实现一个排序算法,但不幸的是你的算法不正确。这看起来像是一个非常缓慢的算法开始,但它不是很正确

要完成所要做的工作,更好的方法是使用方法或ArrayList或泛型列表类。这些排序方法允许您在通用列表的情况下提供IComparer实现或比较委托,以指定排序标准,并且在内部使用正确有效的排序算法

如果使用通用列表,则只需传入lambda表达式,并让它根据日期字段指定排序条件,如下所示:

// Assuming EventHolder is a List<Event>
EventHolder.Sort((d1, d2) => DateTime.ParseExact(d1.Date_And_Time,"dd/MM/yyyy HH:mm",region).CompareTo(DateTime.ParseExact(d2.Date_And_Time,"dd/MM/yyyy HH:mm",region)));

如果您真的不需要ArrayList和.NET 3.5,请尝试以下操作:

List<Event> eventHolder = ... // Just to make certain it's a List<Event>
eventHolder = eventHolder
    .OrderBy(e => DateTime.ParseExact(e.Date_And_Time,"dd/MM/yyyy HH:mm",region)
    .ToList();

我不认为ArrayList是泛型类型。您可能需要更正您的示例。感谢您的快速回复。我现在正试图理解这段代码,并将其应用到我的程序中。你必须坚持使用旧而丑陋的ArrayList吗?如果使用泛型集合和LINQ,整个任务可以在一行代码中完成。可以使用列表,而不必是arraylist。我建议不要将LINQ用于类似的情况。您可能只得到一行代码,但它比仅使用ArrayList.Sort或List.Sort要慢得多。我现在正在尝试使用Miky的示例中的Lambda表达式进行List.Sort,但它不起作用==我不知道为什么。它只是给出了这样的结果:无法将lambda表达式转换为类型:'System.Collections.Generic.IComparer,因为它不是委托类型。xxbbcc:则相反。什么是lambda表达式?我尝试了这段代码,它给出了一个错误,无法将lambda表达式转换为类型:'System.Collections.Generic.IComparer,因为它不是委托类型。此注释框没有足够的空间来解释lambda表达式是什么,所以我将尝试为您提供一个适用于您的示例的想法:将其视为匿名函数,声明为内联,编译器将其解释为委托。在我的示例中,lambda表达式是d1,d2=>。。。这就像声明一个函数,在这种情况下,该函数接受两个类型为Event的参数d1和d2,然后使用这两个参数返回=>计算结果。有关详细信息,请参见此处lambda表达式的MSDN页面:我已将EventHolder转换为List,并添加了您的代码。它仍然给我一个错误。添加使用System.Linq;也没用。谢谢,我已经修好了。VisualStudio无缘无故地不高兴。我已经将代码转移到另一个项目中,它成功了。
List<Event> eventHolder = ... // Just to make certain it's a List<Event>
eventHolder = eventHolder
    .OrderBy(e => DateTime.ParseExact(e.Date_And_Time,"dd/MM/yyyy HH:mm",region)
    .ToList();