2013-07-15 3 views
7

सी # में, का उपयोग IOrderedEnumerable के तत्वों को प्रोजेक्ट ऑर्डर बनाए रखने के लिए करेगा?IOrderedEnumerable.Select() तत्व ऑर्डर बनाए रखेगा?

  • यदि हां, तो यह IEnumerable कैसे लौटाता है, और IOrderedEnumerable नहीं?
  • यदि नहीं, तो मैं इसे कैसे प्राप्त कर सकता हूं (foreach का उपयोग करने के अलावा)?

ध्यान दें कि यह प्रश्न this one का डुप्लिकेट नहीं है - मैं केवल एक Select() खंड है, Distinct() wihtout।

संपादित

हाँ, यह वस्तुओं के लिए LINQ है। बीटीडब्ल्यू, अगर मैं वास्तव में कुछ एसक्यूएल डीबी पूछताछ कर रहा हूं तो क्या उत्तर अलग होगा?

+0

शायद। हालांकि मैं 'चयन' का उपयोग नहीं करता हूं, फिर भी मैं परिणामों को क्रमशः पहले क्रमशः परिणाम पेजिंग करता हूं और फिर वर्तमान पृष्ठ से संबंधित परिणामों के सबसेट प्राप्त करने के लिए 'छोड़ें' और 'टेक' को कॉल करता हूं। आदेश हमेशा विश्वसनीय रूप से बनाए रखा गया है, इसलिए मैं उम्मीद करता हूं कि यह 'चयन' के दौरान भी काम करे ... बस इसका परीक्षण करें और – musefan

+0

देखें क्या यह LINQ ऑब्जेक्ट्स है? –

+0

इस पोस्ट में 'IOrderedEnumerable' (और इसका उपयोग मुख्य रूप से माध्यमिक प्रकार मानदंड लागू करने) का उपयोग करने के लिए थोड़ा और विवरण है http://stackoverflow.com/questions/8518557/when-to-return-iorderedenumerable –

उत्तर

9

Select तत्व ऑर्डर नहीं बदलता है। यह streaming operator (MSDN) है, जिसका अर्थ है कि यह स्रोत के क्रम में स्रोत तत्वों को संसाधित करता है और अनुमानित तत्वों को एक-एक करके उत्पन्न करता है।

तो, यदि आप आदेशित स्रोत का प्रक्षेपण कर रहे हैं, तो अनुमानित परिणाम स्रोत तत्वों का क्रम बनाए रखेंगे।


एक और बात - आप सोच हो सकता है क्यों परिणाम को लागू नहीं करता है IOrderedEnumerable<T>:

int[] items = { 2, 3, 1, 8, 5 }; 
IEnumerable<int> query = items.OrderBy(i => i).Select(i => i); 
bool isOrdered = query is IOrderedEnumerable<int>; // false 

यह क्योंकि Select ऑपरेटर रिटर्न नई इटरेटर वस्तु (WhereSelectArrayIterator इस मामले में), जो स्रोत संग्रह से आइटम (पढ़ता है इस मामले में OrderedEnumerable) एक-एक करके, प्रोजेक्ट आइटम, और प्रक्षेपण देता है। यह नया इटरेटर ऑब्जेक्ट IOrderedEnumerable<T> इंटरफ़ेस को लागू नहीं करता है, यह केवल सरल IEnumerable<T> है। आदेशित संग्रह अब इटेटरेटर का स्रोत है, लेकिन इटेटरेटर स्वयं नहीं है।

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