以前有个哥们好像写过类似的文章。当时没有注意,今天才发现有时候Sort时候真会带来麻烦。说说我遇到的麻烦:
我需要监控一个机器的状态,得到的数据类似:
1-PRD 8:30:00
2-STD 8:30:00
3-PRD 9:30:00
4-STD 9:31:00
我把数据都放在一个List<StateItem>容器里面,同时StateItem实现了IComparable接口,是datetime来排序。其实数据过来时候也是按照时间来排序,但是我仍然做了Sort操作。
结果问题出现了,我出来的统计报表跟以前跑的报表由差距。
PRD time : (2)-(1)+(4)-(3) = 1 Min
STD time : (3)-(2) = 1 hour
结果排序后,数据顺序成了(1)和(2)调换了,
1-STD 8:30:00
2-PRD 8:30:00
3-PRD 9:30:00
4-STD 9:31:00
PRD time : (4)-(2) = 1 hour +1min
STD time : 0
结果大相径庭。 :(
总结:排序的时候要考虑到相同rank的情况。
另外一种情况是由于比较数接近造成的问题
int IComparable.CompareTo( stateItem item)
{
return Convert.Int32((this.datetime – item.datetime).TotalMinutes);
}
好像没有错。但请考虑当totalMinutes<1为小数的情况,则无法判断两个对象的次序。
OK,转成
return this.datetime.ticks.CompareTo(item.datetime.ticks);
enn….
关于排序的接口有2个:
1 IComparable
子项完成。
2. IComparer
容器完成
除此,Sort支持直接调用方法
ListExample.Sort(Method1);
public int Method1(item X, item Y)
{
…..
}