2011-01-24 29 views
8

Tôi muốn sắp xếp danh sách chung chung của mình bằng cách sử dụng phương pháp sắp xếp được tích hợp sẵn.Sự cố Delphi: Sắp xếp danh sách từ chối <>

đây là những gì tôi làm:

//create the list object 
myList := TObjectList<MyType>.Create(false); 

[...] //populate the list with unsorted entries 

//sort the list 
myList.sort(@Comparer); 

[...]//store sorted results back to array 

myList.Destroy; 

chức năng Comparer của tôi trông như thế này:

function Comparer(Item1, Item2 : pointer):integer; 
begin 
    result := myCompare(item1, item2); 
end; 

Theo thông số kỹ thuật, nó sẽ hoạt động như thế này.

tôi nhận được một biên dịch lỗi E2250 Không có phiên bản quá tải của 'Sắp xếp' tồn tại với các thông số (chính xác từ ngữ khác, tôi sử dụng một phiên bản tiếng anh không của RAD Studio)

Tôi không có ý tưởng tại sao điều này không nên là Pascal hợp lệ - có ai trong các bạn có cái nhìn sâu sắc để chia sẻ về điều này không?

+0

Mặc dù Leonardo và tôi cung cấp thêm chi tiết, câu trả lời của Rob hữu ích nhất đối với bạn. Trình biên dịch thường đưa ra lý do rõ ràng tại sao nó đối tượng với một cái gì đó. –

Trả lời

8

Bạn sắp hoàn tất. Vì tôi không biết những gì MyType là bạn có thể cần phải thay đổi cuộc gọi đến chức năng myCompare của bạn.

myList.Sort(TComparer<MyType>.Construct(
    function (const L, R: MyType): integer 
    begin 
    result := myCompare(L, R); 
    end 
)); 
+0

+1 Leonardo. es bueno ver a otro programador delphi chileno bởi aqui, pense que estaba solo;). – RRUZ

+0

Heh. Habíamos hartos en los tiempos de Delphi ... –

+0

Bueno me referia en realidad một StackOverflow, pero sobre delphi tienes razon, al parecer somos una raza en extinción. – RRUZ

6

TObjectList<T>.Sort được khai báo là:

procedure Sort(const AComparer: IComparer<T>); 

IComparer<T> được định nghĩa là:

IComparer<T> = interface 
    function Compare(const Left, Right: T): Integer; 
end; 

Bạn đang instantiating TObjectList<MyType> và do đó bạn cần phải vượt qua một IComparer<MyType>-Sort. Để làm điều này, bạn sẽ cần một đối tượng để cung cấp một triển khai cụ thể về giao diện đó.

Một cách rõ ràng để làm điều này sẽ là phân lớp TObjectList<MyType> và triển khai giao diện ở đó.

Cách khác để thực hiện việc này là sử dụng TComparer<T> để tạo một yêu cầu IComparer<T> theo nhu cầu sử dụng chức năng lớp học Construct của nó. Bạn cần cung cấp chức năng so sánh:

TComparison<T> = reference to function(const Left, Right: T): Integer; 

Câu trả lời của Leonardo thể hiện cách thực hiện điều này.

4

Nếu trình biên dịch cho biết không có phiên bản quá tải tồn tại với loại tham số đó, hãy tự hỏi mức độ quá tải do tồn tại. Kiểm tra mã nguồn hoặc the documentation để tìm hiểu.

Ở đó bạn sẽ thấy rằng TObjectList<T> kế thừa hai phương thức Sort từ TList<T>. Người ta không có đối số, và người kia có tham chiếu đến một cái gì đó thực hiện giao diện IComparer<T>. Chức năng độc lập của bạn không phù hợp với điều đó. Viết một hậu duệ của TComparer<MyType> và ghi đè phương thức Compare của nó.

Các vấn đề liên quan