क्या LINQ वास्तव में परिणामों की गहरी प्रतिलिपि को एक अलग सूची/सरणी/आदि में करता है, या यह मुझे बस एक सूची/सरणी/आदि देता है। मूल के संदर्भ से बना है?रिटर्न बनाने पर LINQ नई मेमोरी करता है
उत्तर
यह परिणाम प्रोजेक्ट करने के लिए चयन करें (और कैसे) पर निर्भर करता है।
यदि आप प्रक्षेपण में नई वस्तुएं नहीं बनाते हैं तो परिणाम मूल संग्रह के समान वस्तुओं को संदर्भित करेगा।
यदि, हालांकि, आप प्रोजेक्ट में नई ऑब्जेक्ट्स बनाते हैं, तो जाहिर है, वे वही नहीं होंगे।
संग्रह यहाँ लौटे _myCollection
में ही वस्तुओं के संदर्भ हो जाएगा:
from m in _myCollection
where m.SomeFilterCriteria
select m
संग्रह इन मामलों में वापस नहीं होगा:
from m in _myCollection
where m.SomeFilterCriteria
select new { m.Prop1, m.Prop2 }
इस मामले में, यह उनका कहना है लायक है कि नए अज्ञात ऑब्जेक्ट का Prop1 और Prop2 - यदि वे संदर्भ प्रकार हैं - इसमें मूल ऑब्जेक्ट के रूप में समान ऑब्जेक्ट का संदर्भ होगा। संग्रह में केवल शीर्ष-स्तरीय संदर्भ अलग-अलग होंगे।
मूल रूप से - सीरियललाइज़र से अलग कुछ भी नहीं (जैसा कि यहां कहीं और बताया गया है) "गहरी" प्रतिलिपि होगी, जब तक कि आप इसे लागू नहीं करते।
या
from m in _myCollection
where m.SomeFilterCriteria
select m.Clone()
फिर, यह एक गलती है कि किसी भी "गहरी" नकल यहाँ पर जा रहा है की कल्पना करनी होगी। बेशक, Clone
का कार्यान्वयन कक्षा में होगा और गहरी प्रतिलिपि सहित कुछ भी हो सकता है, लेकिन यह नहीं दिया गया है।
आपके आखिरी उदाहरण पर, मैंने सोचा कि क्लोन() 'केवल एक उथली प्रतिलिपि करता है। –
क्लोन कॉपी करेगा हालांकि इसे ऐसा करने के लिए लागू किया गया था। कोई डिफ़ॉल्ट नहीं है। क्लोन - आपको इसे किसी ऑब्जेक्ट के लिए कार्यान्वित करना होगा जिसे आप इसका समर्थन करना चाहते हैं। मेरा जवाब केवल संग्रह में शीर्ष-स्तरीय संदर्भों से बात करता है। .Net में कुछ भी "गहरी" प्रतियां नहीं। –
@ जोएल बी: qstarin की टिप्पणी में जोड़ने के लिए, [एमएसडीएन लेख] (http://msdn.microsoft.com/en-us/library/system.icloneable.clone.aspx) स्पष्ट रूप से बताता है कि "क्लोन को या तो कार्यान्वित किया जा सकता है एक गहरी प्रति या एक उथली प्रतिलिपि के रूप में। "तो, न केवल क्लोन प्रतिलिपि होगी, हालांकि इसे ऐसा करने के लिए लागू किया गया था, लेकिन एमएसडीएन दस्तावेज के अनुसार उथले और गहरी प्रति ** ** ** स्वीकार्य कार्यान्वयन हैं। दिलचस्प बात यह है कि ऑब्जेक्ट में संरक्षित [memberwiseClone] (http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx) सदस्य उथले प्रतियां बनाने के लिए है। – Brian
यह जो भी लौटाता है वह बहुत निर्भर है जिस पर आप LINQ विधि का जिक्र कर रहे हैं। लेकिन कुछ विधियों के अपवाद के साथ जो उदाहरण के लिए गणना (ToList
और ToArray
स्पष्ट रूप से प्रतिलिपि बनाते हैं) सामान्य पैटर्न इनपुट को प्रतिलिपि बनाने की नई संरचना में नहीं है। इसके बजाय यह आलसी मूल्यांकन पसंद करता है।
यदि आप प्रश्न को फिर से पढ़ते हैं, तो आप पाएंगे कि ToList() और ToArray() विशेष नहीं हैं। :) – bzlm
@bzlm, यह सुनिश्चित नहीं है कि प्रश्न मेरे उत्तर के उस हिस्से से कैसे संबंधित है। मैं उन्हें विशेष रूप से 2 LINQ विधियों के रूप में कॉल करना चाहता था जो इनपुट के बेसब्री से मूल्यांकन करते हैं और बाकी के बारे में विस्तृत बयान देने से पहले इसके लिए एक नई संग्रह संरचना तैयार करते हैं। मैंने यह नहीं कहा कि यह एक गहरी प्रतिलिपि है इसलिए सुनिश्चित नहीं है कि आप किस चीज का जिक्र कर रहे हैं। – JaredPar
@ जेरेडपार सवाल यह है कि "क्या LINQ वास्तव में एक गहरी प्रतिलिपि करता है [...] या क्या यह मुझे मूल रूप से संदर्भों से बना एक सूची [...] देता है। आपका उत्तर इस बारे में है कि * गणना * का मूल्यांकन किया जाता है या नहीं। सही? – bzlm
क्या LINQ वास्तव में परिणामों की एक गहरी प्रतिलिपि को एक अलग सूची/सरणी/आदि में करता है, या यह मुझे बस एक सूची/सरणी/आदि देता है। मूल के संदर्भ से बना है?
Enumerable.ToArray से। (समान पाठ Enumerable.ToList में पाया)
toArray (IEnumerable) विधि बलों तत्काल प्रश्न मूल्यांकन और एक सरणी कि क्वेरी परिणाम होता है देता है। क्वेरी परिणामों की कैश की गई प्रति प्राप्त करने के लिए आप इस विधि को अपनी क्वेरी में जोड़ सकते हैं।
अच्छा, यह निश्चित रूप से भ्रमित लग रहा है।
- एक सरणी जिसमें क्वेरी परिणाम
- प्राप्त क्वेरी की कैश्ड प्रतिलिपि परिणाम
पहला वाक्य से लौटता है, यह स्पष्ट है कि क्वेरी में आइटम का कोई प्रतियां बना रहे हैं।
दूसरी वाक्य से, आपको पूरी तरह से क्वेरी परिणामों की एक प्रति प्राप्त होती है, लेकिन यह से एक उथली प्रति है, क्वेरी में आइटमों की कोई प्रतियां बनाई गई हैं।
- 1. रिटर्न वैल्यू एक नई लाइन पर होने पर जावास्क्रिप्ट रिटर्न स्टेटमेंट क्यों काम नहीं करता है?
- 2. क्या LINQ इंडेक्स पर काम करता है?
- 3. पाइथन समान स्ट्रिंग के लिए नई मेमोरी आवंटित करता है?
- 4. LINQ रिटर्न 0 परिणामों
- 5. LINQ क्वेरी का रिटर्न प्रकार क्या है?
- 6. Linq नई वस्तु
- 7. नई लाइन और रिटर्न मैसेजबॉडी
- 8. इन-मेमोरी LINQ प्रदर्शन
- 9. सी ++ रिटर्न संदर्भ/स्टैक मेमोरी
- 10. रेल पर रूबी, नई वस्तु बनाने, बनाने या नई विधि का उपयोग करें?
- 11. LINQ अलग करके नई क्वेरी
- 12. बंडल बनाने और नई गतिविधि
- 13. कई नई ऑब्जेक्ट्स बनाते समय मेमोरी ब्लोट
- 14. एकाधिक दृश्य बनाने पर जावाएफएक्स 2.0 मेमोरी लीक
- 15. एनम सी पर मेमोरी आवंटित कैसे करता है?
- 16. "रिटर्न फ़ंक्शन() {...}" जावास्क्रिप्ट में क्या करता है?
- 17. क्या सी ++ रिटर्न स्टेटमेंट लागू करता है?
- 18. LINQ नई ऑब्जेक्ट का चयन करें, फंक्शन
- 19. नई इकाई डेटा मॉडल बनाने में समस्या
- 20. पुरानी सूची से नई सूची बनाने के लिए LINQ और C# का उपयोग करें
- 21. LINQ-to-SQL समर्थन कंपोज़ेबल क्वेरीज़ करता है?
- 22. NHibernate - ऑटो बनाने और अपडेट पर टाइमस्टैम्प उत्पन्न करता है?
- 23. java.lang.OutOfMemoryError: नई देशी धागा बनाने में असमर्थ
- 24. वाक्यविन्यास 'नई कक्षा [] {}' कैसे काम करता है?
- 25. हैशटेबल कितनी मेमोरी का उपयोग करता है?
- 26. linq अंतिम() कैसे काम करता है?
- 27. कैसे कैश मेमोरी काम करता है?
- 28. LINQ। डिज़ाइन विधि कैसे क्रमबद्ध करता है?
- 29. मानदंड नई वस्तु बनाने वक्तव्य का चयन
- 30. रेल बनाने की क्रिया इंडेक्स पर रीडायरेक्ट कर रही है जब इसे नई क्रिया
.NET में कुछ भी नहीं - शायद क्रमबद्धता को छोड़कर - कभी भी स्वचालित रूप से किसी भी चीज की गहरी प्रतिलिपि बनाता है। कारणों में से एक यह है कि गहरी प्रतियां स्वचालित रूप से निर्माण करने के लिए तुच्छ नहीं हैं। – bzlm
@bzlm - इसलिए जब मैं LINQ क्वेरी के परिणाम को संपादित करता हूं, तो मैं वास्तव में मूल संग्रह के सदस्य का मान संपादित कर रहा हूं? –
हां, आप हैं। कोशिश करो। :) – bzlm