2011-11-28 8 views
7

जिज्ञासा से बाहर है, मौजूदा सूची पर IENumerable.ToList() को कॉल क्यों करना एक ही उदाहरण नहीं देता है? IENuerable.ToArray() पर भी लागू होता है। क्या यह स्मृति खपत दृष्टिकोण से बेहतर नहीं होगा?.NET एक मौजूदा सूची पर IENumerable.ToList() क्यों नई सरणी

मैं निम्नलिखित त्वरित परीक्षण भागा:

var things= new List<Thing>(new [] {new Thing(), new Thing()}); 
     Console.WriteLine(things.GetHashCode()); 

     things= things.ToList(); 
     Console.WriteLine(things.GetHashCode()); 

और मैं अलग वस्तु उदाहरणों मिलता है। क्यों न केवल एक ही उदाहरण?

उत्तर

9

यह जानबूझकर "कॉपी सूची" परिदृश्य को सक्षम करने के लिए किया जाता है।

उदाहरण के लिए, मैं foreach(var a in list) list.Remove(a) करता हूं, मुझे यह कहते हुए एक अपवाद मिलेगा कि "संग्रह संशोधित किया गया है" जबकि गणना प्रगति पर थी।

इसे ठीक करने के लिए, मैं करता हूं: foreach(var a in list.ToList()) list.Remove(a)

यदि आप "सूची में कनवर्ट करें" की लाइनों के साथ अर्थशास्त्र चाहते हैं, तो यह पहले से ही नहीं है, आपको इसे स्वयं संभालना होगा। वास्तव में, आपसे वास्तव में यह एक साफ विस्तार विधि लिख सकते हैं:

public static IList<T> ToListIfNotAlready(this IEnumerable<T> source) 
{ 
    var list = source as IList<T>; 
    return list == null ? source.ToList() : list; 
} 

हाँ, यह दूसरी तरह के आसपास हो सकता था, लेकिन LINQ डिजाइनरों इस दृष्टिकोण चुना है, और ऐसा करने के लिए हर अधिकार था तो, के रूप में न आम मामले में दृष्टिकोण का अलग फायदा है।

+0

मुझे एक्सटेंशन पसंद है, धन्यवाद। –

1

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

0

ToList() के व्यवहार के पास गणना के साथ कुछ लेना देना नहीं है। यह नाम का तात्पर्य है, यह एक सूची देता है। यह इंगित नहीं करता है कि यह प्रत्येक कॉल के साथ एक ही सूची देता है; अन्यथा; सूची उदाहरण को आंतरिक रूप से कहीं भी संग्रहीत करना होगा। कई अन्य लिंक कार्यों के साथ ही। तथ्य यह है कि यह एक नई सूची देता है वह foreach गणनाकर्ता के साथ उपयोग के लिए फायदेमंद है।

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