2010-08-27 4 views
28

यह संभवतः कुछ के लिए एक मूल प्रश्न है, लेकिन यह मेरे प्रोग्राम के एक टुकड़े को कैसे डिज़ाइन करता है यह प्रभावित करता है।LINQ - क्या कहां अभिव्यक्ति नया उदाहरण या ऑब्जेक्ट इंस्टेंस के संदर्भ में

IEnumerable<A> myCollection; 

मैं 2 अलग मापदंड पर मेरे संग्रह छानने हूँ:

मैं ग्रुप ए के एक भी संग्रह है

IEnumerable<A> subCollection1 = myCollection.Where(x => x.Count > 10); 
etc. 

अब, मुझे पता है कि .Where अभिव्यक्ति एक नया वापस आ जाएगी IENumerable का उदाहरण, लेकिन क्या नए संग्रह में टाइप ए के उदाहरण के समान संदर्भ होता है जो 'myCollection' संदर्भ, या टाइप ए की नई प्रतियां बनाई गई हैं? यदि 'ए' प्रकार के नए उदाहरण बनाए गए हैं, तो क्या यह कहने का एक तरीका है कि 'subCollection1' ए के समान उदाहरणों को 'myCollection' संदर्भों के रूप में संदर्भित करता है?

संपादित करें: आगे स्पष्टीकरण जोड़ने के लिए।

मैं एक ऐसा तरीका ढूंढ रहा हूं ताकि जब मैं 'सब' चयन 'में' ए 'के उदाहरण में परिवर्तन करता हूं, तो इसे' myCollection 'के लिए भी संशोधित किया जाता है।

उत्तर

38

उदाहरण कक्षाएं समान हैं, लेकिन यदि वे structs/value प्रकार हैं तो प्रतियां समान हैं।

int, बाइट और डबल value types हैं, जैसे कि structs (जैसे System.Drawing.Point और स्वयं परिभाषित structs) हैं। लेकिन स्ट्रिंग्स, आपके सभी वर्ग, मूल रूप से "बाकी", reference types हैं।

नोट: LINQ अन्य सभी असाइनमेंट के समान नियमों का उपयोग करता है।

वस्तुओं के लिए:

Person p1 = new Person(); 
p1.Name = "Mr Jones"; 
Person p2 = p1; 
p2.Name = "Mr Anderssen"; 
// Now p1.Name is also "Mr Anderssen" 

structs के लिए:

Point p1 = new Point(); 
p1.x = 5; 
Point p2 = p1; 
p2.x = 10; 
// p1.x is still 5 

वही नियम लागू जब LINQ का उपयोग कर।

+0

है यही तो मैं मान लिया था मदद कर सकते हैं लिखें। मैं तो बस यह सुनिश्चित करें कि कहां अभिव्यक्ति उथले नकल के कुछ प्रकार मेरी कक्षा उदाहरणों पर नहीं कर रहा था बनाना चाहते थे। – Brandon

+1

टिप्पण लायक गुमनाम प्रकार हमेशा वर्ग होते हैं, इसलिए संदर्भ भी। – Richard

+3

@ रिचर्ड: अज्ञात ty को ध्यान देने योग्य भी पीएस सी # में अपरिवर्तनीय हैं, इसलिए आप किसी अज्ञात प्रकार के उदाहरण को संशोधित नहीं कर सकते हैं। – LukeH

9

वे एक ही वस्तुएं हैं। Where केवल फ़िल्टर, Select नए उदाहरण पैदा करता है (उत्पादन कर सकता है)।

2

एक नई वस्तु बनाना जो एक संदर्भ प्रकार है, वह गैर-तुच्छ है। LINQ को पता नहीं होगा कि यह कैसे करें। संदर्भ प्रकार से निपटने के दौरान LINQ हमेशा एक ही उदाहरण देता है।

0

मैं बस कुछ अन्य उत्तरों में जोड़ना चाहता था - आम तौर पर, जब मुझे कुछ सुनिश्चित नहीं होता है लेकिन किसी विशेष व्यवहार की आवश्यकता होती है, तो मैं इसके लिए एक यूनिट टेस्ट जोड़ूंगा। आप आसानी से इसे एक परीक्षण में डाल सकते हैं और फिर समानता की जांच कर सकते हैं, जो आपको बताएगा कि क्या आप मूल कंटेनर में ऑब्जेक्ट का संदर्भ देख रहे हैं। कुछ लोग तर्क दे सकते हैं कि यह बेवकूफ है क्योंकि आपको "पता होना चाहिए" क्या होता है, लेकिन मेरे लिए मुझे पता है कि मैं या तो 1) अनिश्चित हूं क्योंकि मैं एक भयानक प्रोग्रामर नहीं हूं, और 2) हमेशा रातें होती हैं जहां मुझे जलना पड़ता है मध्यरात्रि तेल, और आश्वस्त होना अच्छा होता है कि कुछ ऐसा व्यवहार करता है जिसकी आपको आवश्यकता होती है।

+0

यह प्रश्न stemmed क्योंकि जब मेरे पास एक संग्रह था कि मैं कहां अभिव्यक्ति का उपयोग कर फ़िल्टरिंग कर रहा था, मेरी इकाई फ्रेमवर्क स्वयं ट्रैकिंग संस्थाएं सही ढंग से व्यवहार नहीं कर रही थीं। मेरा मानना ​​है कि समस्या सी # हैंडल संदर्भों के बारे में मेरी गलतफहमी के कारण नहीं है, लेकिन कहां अभिव्यक्ति करने के बाद ट्रैकिंग के साथ एक समस्या बंद हो गई है। – Brandon

9

असल में यह संग्रह पर निर्भर करता है। कुछ मामलों में Linq तरीकों, मूल के संदर्भ के बजाय क्लोन वस्तुओं लौट सकते हैं इस परीक्षण पर एक नज़र डालें:

 [Test] 
    public void Test_weird_linq() 
    { 
     var names = new[]{"Fred", "Roman"}; 
     var list = names.Select(x => new MyClass() { Name = x }); 

     list.First().Name = "Craig"; 
     Assert.AreEqual("Craig", list.First().Name);    
    } 

    public class MyClass 
    { 
     public string Name { get; set; } 
    } 

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

var list = names.Select(x => new MyClass() { Name = x }).ToList(); 

मुझे यकीन है कि क्यों यह इस तरह से काम करता है के लिए पता नहीं है के साथ संशोधित, लेकिन यह मन में है जब आप कुछ अपने कोड :)

को समझने के लिए How LINQ works internally

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