2012-09-13 9 views
13

के साथ एक पूर्णांक सरणी मैं आरोही क्रम में मेरी पूर्णांक सरणी सॉर्ट करने के लिए करना चाहते हैं।क्रमबद्ध orderby

int[] copyArray = myArray.ToArray(); 

तो मैं इस तरह आरोही क्रम में यह सॉर्ट करने के लिए करना चाहते हैं::

पहले मैं अपने सरणी की एक प्रतिलिपि बनाने

int[] sortedCopy = from element in copyArray 
        orderby element ascending select element; 

लेकिन मैं एक त्रुटि मिलती है, "चयनित" हो जाता है हाइलाइज्ड और त्रुटि है: "अंतर्निहित रूप से प्रकार को परिवर्तित नहीं कर सकता" system.linq.iorderedenumerable 'to' int [] '"

+0

आप अगले sortedCopy साथ क्या कर रहे हो? शायद आपको एक सरणी की आवश्यकता नहीं है। – weston

उत्तर

32

आपको अंत में ToArray() पर कॉल करने की आवश्यकता है वास्तव में क्रमबद्ध अनुक्रम को एक सरणी में परिवर्तित करने के लिए। LINQ आलसी मूल्यांकन, जिसका अर्थ है कि जब तक आप ToArray(), ToList() या किसी अन्य समान विधि मध्यवर्ती प्रसंस्करण फोन (इस मामले छँटाई में) नहीं किया जा सकेगा।

ऐसा करने से पहले से ही तत्वों की एक प्रतिलिपि बनाने जाएगा, ताकि आप वास्तव में पहले अपनी खुद की प्रतिलिपि बनाने के लिए की जरूरत नहीं है।

उदाहरण:

int[] sortedCopy = (from element in myArray orderby element ascending select element) 
        .ToArray(); 

यह शायद अभिव्यक्ति वाक्य रचना में यह लिखने के लिए बेहतर होगा:

int[] sortedCopy = myArray.OrderBy(i => i).ToArray(); 
+1

बहुत धन्यवाद श्री जॉन! :) "(i => i)" का क्या अर्थ है? – user1635406

+9

@ उपयोगकर्ता 1635406: 'i => i' एक * लैम्ब्डा फ़ंक्शन * है; यह सरणी को सॉर्ट करने का तरीका बताता है। पहला 'i' का अर्थ है कि यह' i' नामक एक तर्क लेता है (आप कोई कानूनी नाम चुन सकते हैं); यह तर्क एक 'int' है क्योंकि सरणी में यही है। दूसरा भाग वह मात्रा है जिसे आप सॉर्ट करना चाहते हैं।इस मामले में हम प्रत्येक नंबर को "स्वयं के रूप में" क्रमबद्ध करना चाहते हैं, इसलिए 'i => i'। मार्क के जवाब में 'x => x.Name' का अर्थ होगा "प्रत्येक तत्व' x' दिया गया, 'x.Name'' द्वारा क्रमबद्ध करें। – Jon

+0

यदि आप पहली बार सरणी करना चाहते हैं और फिर ऑर्डर करते हैं तो यह तेज़ प्रक्रिया नहीं करेगा? –

1

हम नहीं जानते कि तुम अगले क्या कर रहे हैं, लेकिन हो सकता है आप की जरूरत नहीं है एक सरणी। यह एक और LINQ विवरण, या foreach में जा रहा है, तो बस इसे रखने के रूप में यह है, सबसे बस var का उपयोग करके।

var sortedCopy = myArray.OrderBy(i => i); 

foreach(var item in sortedCopy) 
{ 
    //print out for example 
} 

यह लिनक जितना संभव हो उतना आलसी हो सकता है। आप हमेशा ToArray या ToList डाली तो यह और फिर वहाँ का मूल्यांकन करने से है, और परिणाम के लिए स्मृति को आबंटित कोई विकल्प नहीं है।

14

नोट: यदि आप एक प्रति की जरूरत नहीं है (यानी यह myArray बदलने के लिए स्वीकार्य है), तो एक बहुत सरल और अधिक कुशल दृष्टिकोण बस है:

Array.Sort(myArray); 

इस का इन-जगह तरह करता है सरणी, इस तथ्य का शोषण करती है कि यह एक सरणी है जितना संभव हो उतना कुशल हो।

अधिक जटिल परिदृश्यों के लिए (उदाहरण के लिए, एक वस्तु सरणी के एक सदस्य के लिहाज तरह), आप की तरह कर सकते हैं:

var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray(); 
:

Array.Sort(entityArray, (x,y) => string.Compare(x.Name, y.Name)); 

इस का नैतिक-बराबर है

लेकिन फिर से: जगह में सॉर्ट करना।

+0

धन्यवाद, लेकिन इस बार मुझे एक प्रति की आवश्यकता थी। हालांकि पढ़ना intresting। :) – user1635406

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