के लिए हर *Collection
(HtmlNodeCollection
, TreeNodeCollection
, CookieCollection
आदि) वर्ग उदाहरण है कि मैं एक तरीका है जिसके केवल एक सरणी या सूची को स्वीकार करता है को पास किए जाने (एक विधि है कि उदाहरण के लिए TreeView
में एक TreeNodeCollection
स्वीकार करता है नहीं करना चाहिए था?) मेरे पास है इस तरह की एक एक्सटेंशन-विधि लिखने के लिए:संग्रह को संग्रह या सूची में कनवर्ट करने का त्वरित तरीका?
public static TreeNode[] ToArray(this TreeNodeCollection nodes)
{
TreeNode[] arr = new TreeNode[nodes.Count];
nodes.CopyTo(arr, 0);
return arr;
}
या पूरे संग्रह एक उत्पादन-सूची में आइटम डाले और फिर एक सरणी के लिए उत्पादन-सूची परिवर्तित करने से अधिक पाश:
public static TreeNode[] ToArray(this TreeNodeCollection nodes)
{
var output = new List<TreeNode>();
foreach (TreeNode node in nodes)
output.Nodes(node);
return output.ToArray();
}
तो, मेरा सवाल है: मुझे अक्सर इस एक्सटेंशन-विधियों की आवश्यकता है। यदि सूची बड़ी है, तो आमतौर पर यह बहुत सारी मेमोरी आवंटित कर सकती है। मुझे इस *Collection
कक्षाओं द्वारा उपयोग की जाने वाली आंतरिक सरणी में केवल एक संदर्भ (प्रतिलिपि नहीं) क्यों नहीं मिल सकता है ताकि मुझे उस एक्सटेंशन का उपयोग करने और इस स्मृति आवंटन को प्रतिबिंबित करने की आवश्यकता न हो? या यहां तक कि ToArray()
विधि प्रदान करें। हमें उस अंतिम मामले में उपयोग किए जाने वाले आंतरिक कार्यान्वयन या सरणी को जानने की आवश्यकता नहीं है।
'मुझे एक विधि को पास करने की आवश्यकता है जो केवल एक सरणी या सूची स्वीकार करता है' क्यों नहीं 'IENumerable '? आप आसानी से 'treeNodeCollection.Cast ()' पूर्व के लिए पास कर सकते हैं। –
EZI
'IENumerable' का उपयोग करें। यदि आपको सरणी की आवश्यकता है, तो 'संग्रह' का उपयोग करें। कैस्ट ()। टोएरे() 'और अपने एक्सटेंशन विधियों से पूरी तरह से छुटकारा पाएं। –
'कैस्ट <>() 'वास्तव में अच्छा ... क्या संग्रह है। कैस्ट()। टोएएरे()' मेरे 'से अलग है। टोएएरे()' एक्सटेंशन (तथ्य यह है कि यह मूल रूप से मूल है)? –
Jack