以前有個哥們好像寫過類似的文章。當時沒有注意,今天才發現有時候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)
{
…..
}