2010-05-07 10 views
41

स्पष्ट रूप से LINQ की "ऑर्डरबी" मूल रूप से अस्थिर के रूप में निर्दिष्ट किया गया था, लेकिन ओर्का के समय तक इसे स्थिर के रूप में निर्दिष्ट किया गया था। नहीं सभी प्रलेखन तदनुसार अद्यतन किया गया है - इन कड़ियों पर विचार करें:क्या LINQ "ऑर्डरबी" द्वारा सॉर्टिंग एल्गोरिदम का उपयोग किया जाता है?

लेकिन अगर LINQ के OrderBy अब "स्थिर" है तो यह है कि यह एक quicksort का उपयोग नहीं कर रहा है इसका मतलब है (जो स्वाभाविक रूप से अस्थिर है) भले ही कुछ दस्तावेज (जैसे ट्रॉय की पुस्तक) कहता है। तो मेरा सवाल है: यदि quicksort नहीं है, तो वास्तविक एल्गोरिदम LINQ का ऑर्डर क्या उपयोग कर रहा है?

+0

stictly, Linq के 'OrderBy' स्थिरता के लिए निर्दिष्ट नहीं है। 'संख्यात्मक। ऑर्डर बी 'स्थिर के रूप में निर्दिष्ट है, अन्य प्रदाता भी उस वादे की पेशकश करने के लिए स्वतंत्र हैं लेकिन नहीं कर सकते हैं। ऐसा करना असंभव या बहुत महंगा हो सकता है (उदाहरण के लिए पी-लिनक के संदर्भ में समानांतरता पर असर डालने पर विचार करें) या अपेक्षाकृत सस्ते, जो प्रदाताओं द्वारा किए जाने वाले कार्यों पर एक बड़ा प्रभाव है। –

+0

एक बहुत संबंधित पोस्ट [यहां] (https://stackoverflow.com/q/148074/465053)। – RBT

उत्तर

46

का उपयोग करता है, यह एक स्थिर quicksort कि प्रयोग किया जाता है है। किसी भी अन्य प्रकार के LINQ के लिए, यह अंतर्निहित कार्यान्वयन के लिए छोड़ दिया गया है।

+0

अगर मैं एक वस्तु के रूप में संदर्भित है केवल 'IEnumerable ' कैसे Linq पता अगर यह है Linq करने वाली वस्तुओं या कुछ और अन्य? – Dai

+0

IEnumerable हमेशा वस्तुओं के लिए Linq – John

+0

@Dai IEnumerable एक इंटरफेस है, इसलिए यह वास्तव में किस प्रकार अंतर्निहित संग्रह है की निर्भर करता है (मैं @ जॉन के साथ सहमत न) (बनाम IQueryable जो करने के लिए जो कुछ भी Linq है)। उदाहरण के लिए, सूची IEnumerable लागू करता है, और आप एक सूची IEnumerable के रूप में घोषित हो सकता था। यदि आप इस सूची में ऑर्डर करते हैं, तो लिंक-टू-ऑब्जेक्ट प्रदाता का उपयोग किया जाता है। दूसरी ओर।डीबीसेट भी आईन्यूमेरेबल लागू करता है। यदि आप इस डीबीसेट पर ऑर्डर करते हैं, भले ही इसे एक आईनेमरेबल के रूप में घोषित किया गया हो, तो लिंक-टू-एसक्यूएल प्रदाता का उपयोग किया जाएगा। यदि आप एक डीबीएसईटी पर linq-to-ऑब्जेक्ट्स का उपयोग करना चाहते हैं, तो आप dbset कर सकते हैं। ASENumerable()। ऑर्डरबी (लैम्ब्डा) –

3

मुझे समझ में आता है कि OrderBy SQL में अनुवाद किया गया है जो डेटाबेस पर सॉर्ट करता है। LINQ के मामले में कम से कम

+8

हां, लेकिन यह केवल लिंक से SQL और अन्य डेटाबेस लिंक प्रदाताओं के लिए सच है। लिंक सिर्फ एक ओआरएम नहीं है ... (ऑब्जेक्ट्स के लिए लिंक, एक्सएमएल से लिंक ...) –

+0

+1 LINQ से ऑब्जेक्ट्स –

33

बूट अप परावर्तक SQL करने के लिए, System.Linq.EnumerableSorter के लिए खुला पता चलता है कि Linq2Objects वस्तुओं के लिए LINQ के लिए त्वरित तरह

+2

+1 के अलावा कुछ अन्य पर विचार करने के लिए –

+2

+1 इसे देखने के लिए – helios456

+0

+1 इसे देख रहा हूँ लेकिन एक साधारण परीक्षण से पता चलता अनुसार क्रमबद्ध कोई n^2 रिवर्स के तत्वों संख्या के रूप में समय खपत में वृद्धि पूर्णांक बढ़ जाती है की सूची, के रूप में यह en.wikipedia.org/wiki/Quicksort के अनुसार किया जाना चाहिए मैंने कोशिश की 1k और 1M तत्वों बुरी से बुरी हालत - समय खपत में केवल 50 गुना वृद्धि हुई – EvAlex

8

क्विक्सॉर्ट का उपयोग किया जाता है, लेकिन यह स्थिर क्यों है क्योंकि तत्वों की प्रत्येक जोड़ी के सूचकांक की तुलना की जाती है यदि सभी चाबियाँ बराबर होती हैं।

दूसरे शब्दों में, आप तुलनात्मक कार्य में शामिल करके किसी भी त्वरित गति को स्थिर कर सकते हैं, दोनों तत्वों के मूल सूचकांक की तुलना में गिरावट के रूप में।

स्रोत: http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,1395017e067e5a34

+0

ठंडा। मैं नहीं जानता था कि – AaronHS

संबंधित मुद्दे