2009-03-02 14 views
5

मैं लुआ में एक LINQ क्लोन लागू कर रहा हूं, लेकिन यह यहां बहुत प्रासंगिक नहीं है, और मुझे अधिकतर सुविधाएं मिल चुकी हैं (संख्यात्मक/क्वेरी करने योग्य, अभी तक प्रीकंपेलर नहीं), लेकिन ऑर्डरबी के कार्यान्वयन के लिए एक स्मार्ट तरीका नहीं सोच सकता तब तक।ऑर्डरबी/फिरबी लागू करने का स्मार्ट तरीका क्या है?

वर्तमान में मैं एक बार सॉर्ट करता हूं, फिर नई सूचियों में डालता हूं और फिर उन उप सूचियों को सॉर्ट करता हूं और अंत में परिणाम फिर से मर्ज करता हूं, लेकिन यह बहुत ही अपमानजनक और सुरुचिपूर्ण लगता है, मुझे यकीन है कि किसी ने ऐसा करने का एक स्मार्ट तरीका निकाला है (बेहतर एल्गोरिदम), लेकिन मुझे नहीं पता कि यह क्या है। ऑर्डरबी/फिरबी को एक कुशल तरीके से कार्यान्वित करने के तरीके के बारे में कोई संकेत?

नोट: भाषा और भाषा संरचना उम्मीद है कि यहां प्रासंगिक नहीं हैं, मैं सामान्यीकृत एल्गोरिदम की तलाश में हूं, जैसा कि किसी भी भाषा में बाइनरी सॉर्ट किया जा सकता है।

संपादित करें: वर्तमान में मैं LINQ से ऑब्जेक्ट पर काम कर रहा हूं, इसलिए किसी भी विचार से यह विशेष रूप से कैसे किया जाएगा। मैं ऑर्बरबी/अनुमान लगा रहा हूं कि 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

लेकिन एक OrderBy/ThenBy नहीं दो अलग-अलग समारोह कॉल में किया जाना चाहिए? –

+0

@Robert - कम से कम Linq2SQL के साथ यह इच्छित अभिव्यक्ति को पूरा करने वाली एक अभिव्यक्ति उत्पन्न करने के लिए विधियों की पूरी श्रृंखला का उपयोग करता है। इस पर निर्भर करता है कि आपका क्लोन स्थगित निष्पादन का उपयोग करता है या नहीं, इसके परिणामस्वरूप ऑर्डरबी/तो एक ही तुलना में गिर सकता है। – tvanfosson

+0

क्या यह केवल सत्य और गलत के साथ किया जा सकता है? –

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 
संबंधित मुद्दे