我有一个问题。
我有ArrayList
个对象。每个对象都包含一个DateTime
数据字段。
我需要通过此ArrayList
数据字段对此DateTime
进行排序。
这是我目前的代码,但不起作用:
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个日期来测试它是否有效:
23/11/2011 12:15
28/06/2010 04:05
02/09/1992 03:54
输出始终为:
28/06/2010 04:05
02/09/1992 03:54
23/11/2011 12:15
我尝试使用&gt;和&lt;运营商进行比较并得到相同的结果。我还尝试使用不同的命令将字符串转换为DateTime对象,如Convert.ToDateTime
,DateTime.Parse
。尝试在没有HH的情况下进入:mm(相应地调整了代码)并且仍然具有相同的输出。我尝试不使用IFormatProvider
(将其设置为null)并再次无处可寻。
偶然的机会,我找到了这个帖子:
How to sort ArrayList of DateTime objects in descending order?
我从对象中提取了所有日期并将它们放入此DateTime列表中。使用List.Sort()
并生成正确的输出。但后来我陷入了如何使用这个排序列表来排序我的EventHolder ArrayList。我已经在这堵墙上敲了一会儿,没有结果。
我对编程很陌生,所以我几乎不知道做我正在做的事情的任何好方法。它甚至不起作用。 任何人都可以向我解释我哪里出错了吗?
答案 0 :(得分:0)
使用ArrayList.Sort()
的{{3}}重载 - 您将获得与对象进行每次比较的回调,然后您可以轻松比较对象中的两个日期。
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 () );
答案 1 :(得分:0)
这是一种错误的方法imo,更好的方法是使用Custom comparer。
public class SortByDateTime: IComparer {
// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
int IComparer.Compare( Object x, Object y ) {
// Compare objects according to the date
}
}
...
// Sort the arraylist using the custom comparer
IComparer myComparer = new SortByDateTime();
ArrayList mList = new ArrayList();
mList.Sort(myComparer);
答案 2 :(得分:0)
你要做的是实现一种排序算法,但遗憾的是你的排序算法不正确。它几乎看起来像Bubble Sort,这是一个非常慢的算法,但它不太正确。
更好地完成您要做的事情的方法是使用Sort方法或ArrayList或通用List&lt;&gt;类。这些排序方法允许您提供IComparer实现(或通用List的比较委托)以指定排序条件,并在内部使用正确有效的排序算法。
如果您使用通用列表&lt;&gt;你可以传入一个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)));
答案 3 :(得分:0)
如果您确实不需要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();