2011-01-21 10 views
6

क्या LINQ वास्तव में परिणामों की गहरी प्रतिलिपि को एक अलग सूची/सरणी/आदि में करता है, या यह मुझे बस एक सूची/सरणी/आदि देता है। मूल के संदर्भ से बना है?रिटर्न बनाने पर LINQ नई मेमोरी करता है

+6

.NET में कुछ भी नहीं - शायद क्रमबद्धता को छोड़कर - कभी भी स्वचालित रूप से किसी भी चीज की गहरी प्रतिलिपि बनाता है। कारणों में से एक यह है कि गहरी प्रतियां स्वचालित रूप से निर्माण करने के लिए तुच्छ नहीं हैं। – bzlm

+0

@bzlm - इसलिए जब मैं LINQ क्वेरी के परिणाम को संपादित करता हूं, तो मैं वास्तव में मूल संग्रह के सदस्य का मान संपादित कर रहा हूं? –

+0

हां, आप हैं। कोशिश करो। :) – bzlm

उत्तर

10

यह परिणाम प्रोजेक्ट करने के लिए चयन करें (और कैसे) पर निर्भर करता है।

यदि आप प्रक्षेपण में नई वस्तुएं नहीं बनाते हैं तो परिणाम मूल संग्रह के समान वस्तुओं को संदर्भित करेगा।

यदि, हालांकि, आप प्रोजेक्ट में नई ऑब्जेक्ट्स बनाते हैं, तो जाहिर है, वे वही नहीं होंगे।

संग्रह यहाँ लौटे _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 का कार्यान्वयन कक्षा में होगा और गहरी प्रतिलिपि सहित कुछ भी हो सकता है, लेकिन यह नहीं दिया गया है।

+0

आपके आखिरी उदाहरण पर, मैंने सोचा कि क्लोन() 'केवल एक उथली प्रतिलिपि करता है। –

+0

क्लोन कॉपी करेगा हालांकि इसे ऐसा करने के लिए लागू किया गया था। कोई डिफ़ॉल्ट नहीं है। क्लोन - आपको इसे किसी ऑब्जेक्ट के लिए कार्यान्वित करना होगा जिसे आप इसका समर्थन करना चाहते हैं। मेरा जवाब केवल संग्रह में शीर्ष-स्तरीय संदर्भों से बात करता है। .Net में कुछ भी "गहरी" प्रतियां नहीं। –

+1

@ जोएल बी: 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

2

यह जो भी लौटाता है वह बहुत निर्भर है जिस पर आप LINQ विधि का जिक्र कर रहे हैं। लेकिन कुछ विधियों के अपवाद के साथ जो उदाहरण के लिए गणना (ToList और ToArray स्पष्ट रूप से प्रतिलिपि बनाते हैं) सामान्य पैटर्न इनपुट को प्रतिलिपि बनाने की नई संरचना में नहीं है। इसके बजाय यह आलसी मूल्यांकन पसंद करता है।

+1

यदि आप प्रश्न को फिर से पढ़ते हैं, तो आप पाएंगे कि ToList() और ToArray() विशेष नहीं हैं। :) – bzlm

+1

@bzlm, यह सुनिश्चित नहीं है कि प्रश्न मेरे उत्तर के उस हिस्से से कैसे संबंधित है। मैं उन्हें विशेष रूप से 2 LINQ विधियों के रूप में कॉल करना चाहता था जो इनपुट के बेसब्री से मूल्यांकन करते हैं और बाकी के बारे में विस्तृत बयान देने से पहले इसके लिए एक नई संग्रह संरचना तैयार करते हैं। मैंने यह नहीं कहा कि यह एक गहरी प्रतिलिपि है इसलिए सुनिश्चित नहीं है कि आप किस चीज का जिक्र कर रहे हैं। – JaredPar

+1

@ जेरेडपार सवाल यह है कि "क्या LINQ वास्तव में एक गहरी प्रतिलिपि करता है [...] या क्या यह मुझे मूल रूप से संदर्भों से बना एक सूची [...] देता है। आपका उत्तर इस बारे में है कि * गणना * का मूल्यांकन किया जाता है या नहीं। सही? – bzlm

3

क्या LINQ वास्तव में परिणामों की एक गहरी प्रतिलिपि को एक अलग सूची/सरणी/आदि में करता है, या यह मुझे बस एक सूची/सरणी/आदि देता है। मूल के संदर्भ से बना है?

Enumerable.ToArray से। (समान पाठ Enumerable.ToList में पाया)

toArray (IEnumerable) विधि बलों तत्काल प्रश्न मूल्यांकन और एक सरणी कि क्वेरी परिणाम होता है देता है। क्वेरी परिणामों की कैश की गई प्रति प्राप्त करने के लिए आप इस विधि को अपनी क्वेरी में जोड़ सकते हैं।

अच्छा, यह निश्चित रूप से भ्रमित लग रहा है।

  1. एक सरणी जिसमें क्वेरी परिणाम
  2. प्राप्त क्वेरी की कैश्ड प्रतिलिपि परिणाम

पहला वाक्य से लौटता है, यह स्पष्ट है कि क्वेरी में आइटम का कोई प्रतियां बना रहे हैं

दूसरी वाक्य से, आपको पूरी तरह से क्वेरी परिणामों की एक प्रति प्राप्त होती है, लेकिन यह से एक उथली प्रति है, क्वेरी में आइटमों की कोई प्रतियां बनाई गई हैं।

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