сравнивая GUID, чтобы я мог сортировать по GUID - PullRequest
4 голосов
/ 05 декабря 2009

Какой хороший и быстрый способ сортировки списка GUID (как TGuid). я думал, что я просто использовал бы SysUtils.CompareMem (P1, P2: Pointer; Length: Integer): Boolean; пока я не понял, что это возвращает логическое значение.

Я бы хотел что-то сопоставимое с CompareText () или CompareValue (), которое возвращает целое число, чтобы его можно было использовать в сравнении сортировки.

Полагаю, не многие хотят сортировать GUID ... есть идеи?

Полагаю, я мог бы вызвать несколько каскадных вызовов CompareValue () для содержимого записи TGuid. мои инстинкты говорят мне, что должен быть лучший путь!

спасибо!

Ответы [ 4 ]

14 голосов
/ 05 декабря 2009

Если вы используете Delphi 2009 или новее, вы можете использовать TComparer<TGUID>.Compare() или функцию BinaryCompare, которую он вызывает, из модуля Generics.Defaults.

2 голосов
/ 05 декабря 2009

Я не знаю Delphi, но обычно GUID - это 128-битная шестнадцатеричная строка , вы можете просто преобразовать / проанализировать субэлементы до беззнакового (4 * 4-байтового или 2 * 8-байтового) ) целые числа, а затем сравнить их. Если у вас есть эта функция, просто примените стандартный алгоритм сортировки.

Если мой ответ не удовлетворяет требованиям RFC спецификации GUID , которую использует Microsoft, здесь, вы, возможно, сможете найти более эффективные способы сортировки, извлекающие данные на уровне битов в GUID.

0 голосов
/ 26 марта 2012
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 голосов
/ 06 декабря 2009

Используйте GUIDToString и используйте CompareStr для этого - не самый быстрый вариант, но он работает.

...