2009-12-05 74 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