2009-03-02 52 views
5

我在Lua中實現了一個LINQ克隆,但這裏並沒有太相關,我已經完成了大部分功能(可枚舉/可查詢,而不是預編譯器),但想不到一種聰明的方式來實現OrderBy的ThenBy。什麼是實現OrderBy/ThenBy的智能方式?

目前我排序一次,然後放置在新列表中,然後對這些子列表進行排序,最後再次合併結果,但這看起來非常浪費和不雅,我敢肯定有人已經找到了一個聰明的方法來做到這一點更好的算法),但我不知道它是什麼。有關如何以有效的方式實現OrderBy/Thenby的任何線索?

注意:語言和語言構造有望在這裏不相關,我正在尋找通用算法,就像說二進制排序可以用任何語言完成一樣。

編輯:目前我正在LINQ to Object上工作,所以任何想法如何做,特別是會很好。我猜OrberBy/ThenBy是2個函數調用,不是一個,但我可能是錯的。

回答

3

通常,您可以通過使用合適的比較方法來實現多鍵排序。例如,按姓氏排序,然後名字的名單,你可以使用一個比較函數是這樣的:

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; 
    } 
} 

這裏的關鍵是,我們不看,除非我們的FirstName成員做已經知道兩個LastName成員是平等的。

+0

但應該不是一個排序依據/ ThenBy在兩個不同的函數調用來完成? – 2009-03-02 02:43:35

1

我認爲這也適用:

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

,如果屬實,意味着這應該工作:

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 
相關問題