2009-12-05 71 views
4

排序什麼是排序GUID列表(TGuid)的一個很好的快速方法。我想我只是使用SysUtils.CompareMem(P1,P2:指針;長度:整數):布爾型;直到我意識到它返回布爾值。比較一個GUID,所以我可以通過GUID

我希望可以比較CompareText()或CompareValue()返回的整數,因此可以用於排序比較。

我想沒有多少人希望排序GUID ...任何想法?

我想我可以調用對TGuid記錄的內容的一些級聯調用CompareValue()。我的直覺告訴我必須有更好的方法!

謝謝!

+1

請問您爲什麼要嘗試按GUID進行排序? – 2009-12-05 02:07:16

+0

Microsoft GUID(我假設你在說什麼)是按創建時間排序的,這是一個非常有趣的屬性。按創建時間排序的排序必須發生在GUID屬於同一臺機器上。或者如果網絡中的機器很好地同步,就可以這樣使用;這意味着非時間戳元素不用於排序。 – 2009-12-05 02:24:23

+1

Mike C. - 排序對於一般算法和集合非常有用。考慮一個需要保證有界性能的集合集合 - 平衡樹將是合適的,但它需要一些任意的排序順序。 – 2009-12-05 02:25:39

回答

14

如果您使用的是Delphi 2009或更高版本,則可以使用Generics.Defaults單元中的TComparer<TGUID>.Compare()或調用的BinaryCompare函數。

+0

非常流暢巴里 - 謝謝!我知道在RTL中必須有一些我可以使用的東西! – 2009-12-05 05:09:09

2

我不知道德爾福,但通常是一個GUID是128-bit hexadecimal string,你可以將子元素轉換/解析爲無符號(4 * 4字節或2 * 8字節)整數,然後進行比較。一旦你有了這個功能,就應用一個標準的排序算法。

如果我的答案不符合GUID specification的RFC,則可以在這裏介紹Microsoft使用的方法,您可能會想出更好的方法來提取GUID中的位級數據。

+0

如果 skamradt 2009-12-07 17:24:57

0

使用GUIDToString並在其上做CompareStr - 不是最快的選項,但它的工作原理。

+0

ouch ...字符串比較是非常昂貴的。最好單獨對TGUID元素進行排序,或者將其轉換爲[1..8]整數陣列並比較排列 – skamradt 2009-12-07 17:31:09

-3
Function CompareGUIDS(pvGUID1, pvGUID2 : TGUID) : Boolean; 
Begin 
    If (pvGUID1.D1 = pvGUID2.D1) And 
     (pvGUID1.D2 = pvGUID2.D2) And 
     (pvGUID1.D3 = pvGUID2.D3) And 
     (pvGUID1.D4[ 0 ] = pvGUID2.D4[ 0 ]) And 
     (pvGUID1.D4[ 1 ] = pvGUID2.D4[ 1 ]) And 
     (pvGUID1.D4[ 2 ] = pvGUID2.D4[ 2 ]) And 
     (pvGUID1.D4[ 3 ] = pvGUID2.D4[ 3 ]) And 
     (pvGUID1.D4[ 4 ] = pvGUID2.D4[ 4 ]) And 
     (pvGUID1.D4[ 5 ] = pvGUID2.D4[ 5 ]) And 
     (pvGUID1.D4[ 6 ] = pvGUID2.D4[ 6 ]) And 
     (pvGUID1.D4[ 7 ] = pvGUID2.D4[ 7 ]) Then 
     Result := True 
    Else 
     Result := False; 
End; 
+0

X-Ray正在尋找一種比較GUID(等於,大於,小於)的函數。不適用於與GUID匹配的功能。 – 2012-03-26 13:30:39