2009-03-02 40 views
5

Tôi đang triển khai một bản sao LINQ trong Lua, nhưng điều đó không quá liên quan ở đây và tôi đã có hầu hết các tính năng được thực hiện (có thể đếm/truy vấn, không phải trình biên dịch trước), nhưng không thể nghĩ ra cách thông minh để triển khai OrderBy's ThenBy.Cách thông minh để triển khai OrderBy/ThenBy là gì?

Hiện tại, tôi sắp xếp một lần, sau đó đặt vào danh sách mới rồi sắp xếp các danh sách phụ đó và cuối cùng hợp nhất lại kết quả, nhưng dường như rất lãng phí và không phù hợp, tôi chắc chắn ai đó đã tìm ra cách thông minh để thực hiện điều này (thuật toán tốt hơn), nhưng tôi không biết nó là gì. Bất kỳ manh mối nào về cách thực hiện OrderBy/Thenby một cách hiệu quả?

Lưu ý: Cấu trúc ngôn ngữ và ngôn ngữ hy vọng không có liên quan ở đây, tôi đang tìm thuật toán tổng quát, giống như nói một Phân loại nhị phân có thể được thực hiện bằng bất kỳ ngôn ngữ nào.

Chỉnh sửa: Hiện tại tôi đang làm việc trên LINQ to Object, vì vậy, bất kỳ ý tưởng nào được thực hiện đặc biệt sẽ tuyệt vời. Tôi đoán OrberBy/ThenBy là 2 cuộc gọi chức năng, không phải là một nhưng tôi có thể sai.

Trả lời

3

Thông thường bạn sẽ thực hiện sắp xếp nhiều phím bằng cách sử dụng phương pháp so sánh phù hợp. Ví dụ, để sắp xếp một danh sách tên theo tên cuối cùng và sau đó tên đầu tiên, bạn có thể sử dụng một hàm so sánh như thế này:

int compareNames(Name n1, Name n2) 
{ 
    if (n1.LastName < n2.LastName) { 
     return -1; 
    } else if (n1.LastName > n2.LastName) { 
     return 1; 
    } else if (n1.FirstName < n2.FirstName) { 
     return -1; 
    } else if (n1.FirstName > n2.FirstName) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

Điểm mấu chốt ở đây là chúng ta không nhìn vào FirstName thành viên trừ khi chúng tôi đã biết rằng hai thành viên LastName đều bình đẳng.

+0

Nhưng nên không phải là một OrderBy/ThenBy được thực hiện trong hai cuộc gọi chức năng khác nhau? –

+0

@Robert - ít nhất với Linq2SQL, nó sử dụng toàn bộ chuỗi các phương thức để tạo ra một biểu thức duy nhất đạt được kết quả mong muốn. Tùy thuộc vào việc bản sao của bạn có sử dụng thực thi trì hoãn hay không, nó có thể dẫn đến việc thu nhỏ thứ tự/sau đó thành một so sánh đơn lẻ. – tvanfosson

+0

Điều này có thể được thực hiện với chỉ đúng và sai? –

1

Tôi nghĩ rằng đây cũng làm việc:

function(lh,rh) 
    if lh.first < rh.first then 
     return true 
    elseif lh.second < rh.second then 
     return true 
    end 
    return false 
end 

đó, nếu đúng, có nghĩa là điều này sẽ làm việc:

tests={} 
tests[1]=function(lh,rh) 
    return lh.first < rh.first 
end 
tests[2]=function(lh,rh) 
    return lh.second < rh.second 
end 

function(lh,rh) 
    local res=true 
    local k,v 
    for k,v in ipairs(tests) do 
     res = v(lh,rh) 
     if res then break end 
    end 
    return res 
end 
Các vấn đề liên quan