Sort
과부하를 PMyRecord = ^TMyRecord;
난 항상 약간의 오류가 발생, 함수를 호출하는 다른 방법을 시도
로
function SortKB(Item1, Item2: Pointer): Integer;
begin
Result:=PMyRecord(Item1)^.intVal - PMyRecord(Item2)^.intVal;
end;
PMyRecord과 : 그래서 도움말 파일에 가깝게 유지하려 당신이 사용되어야한다이 하나입니다
procedure Sort(const AComparer: IComparer<TMyRecord>);
지금, 당신은 TComparer<TMyRecord>.Construct
를 호출하여 IComparer<TMyRecord>
를 만들 수 있습니다 . 이처럼 :
var
Comparison: TComparison<TMyRecord>;
....
Comparison :=
function(const Left, Right: TMyRecord): Integer
begin
Result := Left.intVal-Right.intVal;
end;
List.Sort(TComparer<TMyRecord>.Construct(Comparison));
나는 익명의 방법으로 Comparison
기능을 서면으로 작성했습니다,하지만 당신은 평범한 구식 스타일이 아닌 OOP 기능 또는 개체의 방법을 사용할 수 있습니다.
비교 함수의 한 가지 잠재적 인 문제점은 정수 오버플로가 발생할 수 있다는 것입니다. 따라서 기본 정수 비교자를 대신 사용할 수 있습니다.
Comparison :=
function(const Left, Right: TMyRecord): Integer
begin
Result := TComparer<Integer>.Default.Compare(Left.intVal, Right.intVal);
end;
당신이 전역 변수 멀리 저장할 수 있도록 반복 TComparer<Integer>.Default
를 호출하는 비용이 있습니다
var
IntegerComparer: IComparer<Integer>;
....
initialization
IntegerComparer := TComparer<Integer>.Default;
고려해야 할 또 다른 옵션은 목록을 만들 때 비교 자에 전달하는 것입니다. 이 순서를 사용하여 목록을 정렬하는 경우보다 편리합니다.
List := TList<TMyRecord>.Create(TComparer<TMyRecord>.Construct(Comparison));
그리고 당신은 내가 기록 또는 항목의 비표준 목록의 TList를을 알파벳순하는 훨씬 간단 수정 분류 기능을 발견
List.Sort;
감사의 verry 많이! ' Generics.Collections, ...', '사용'에 'TComparison'과'IComparer'에'undeclared'를 넣는 것 이외에 'uses'에 아무것도 넣지 않아도됩니까? 비교 : TComparison; IntegerComparer : IComparer ; –
또한 Generics.Defaults가 필요합니다. 아직 RTL 소스 코드를 찾았습니까? 그것은 당신을 도울 것입니다. –
@David, 제공 한 코드에 대해 'TComparer'가 좋은 선택입니까? 'TComparer'는 추상 기본 클래스를위한 것입니다. 나는 당신의 코드에'TDelegatedComparer'를 사용할 것을 제안합니다. – TLama