2010-04-08 11 views
5

मैं वर्तमान में उपयोग की जाने वाली लाइब्रेरी को दोबारा कर रहा हूं, और मुझे निम्न समस्या का सामना करना पड़ रहा है।सी # में एक सबएरे संदर्भ बनाएं (असुरक्षित का उपयोग कर?)

हम निम्नलिखित सामान किया करते थे:

class Blah 
{ 
    float[][] data; 
    public float[] GetDataReference(int index) 
    { 
     return data[index]; 
    } 
} 

विभिन्न कारणों से, मैं एक 1 dimensionnal सरणी संस्करण के साथ इस दांतेदार सरणी संस्करण जगह ले ली है, भीतरी सरणियों श्रृंखलाबद्ध। मेरा प्रश्न है: मैं अभी भी data की उप सरणी के संदर्भ को कैसे वापस कर सकता हूं?

class Blah 
{ 
    float[] data; 
    int rows; 

    public float[] GetDataReference(int index) 
    { 
     // Return a reference data from offset i to offset j; 
    } 
} 

मैं सोच रहा था कि असुरक्षित और पॉइंटर्स सामान का उपयोग किया जा सकता है, क्या यह करने योग्य है?

उत्तर

10

नहीं, आप यह नहीं कर सकते - लेकिन आपको इसके बजाय ArraySegment का उपयोग करना चाहिए।

ध्यान दें कि एक सरणी वस्तु में इसकी लंबाई आदि के बारे में मेटाडेटा और फिर डेटा स्वयं होता है। आप मौजूदा सरणी का एक टुकड़ा नहीं बना सकते हैं और अभी भी डेटा के बगल में मेटाडेटा है, यदि आप देखते हैं कि मेरा क्या मतलब है - वहां एक अतिरिक्त स्तर का संकेत होना होगा (जो ArraySegment प्रदान करता है)।

(मैं थोड़ा हैरान हूँ कि ArraySegment अधिक रैपिंग, IList<T> को लागू करने से जैसे भी नहीं करता हूँ, लेकिन वहाँ हम चले। यह बहुत आसान इस तरह की संरचना बनाने के लिए हो सकता है अगर आप चाहते थे।)

+0

+1 तुम सीखना कुछ नया हर रोज :-) – WestDiscGolf

+0

सहमत, कि या तो पता नहीं था। मैं अपना जवाब रखूंगा (साथ ही साथ काम करना चाहिए), लेकिन ऐसा लगता है कि यह "सही तरीका" (टीएम) –

+1

एक जंजीर सरणी का मेमोरी लेआउट अपनी सामग्री को प्राप्त करने के लिए असुरक्षित संरचनाओं का उपयोग करने के लिए अव्यवहारिक बनाता है। यदि एकाधिक आयामी सरणी का उपयोग किया जाता है, तो यह किया जा सकता है और (दुर्लभ) कोने मामलों में लाभार्थी हो सकता है जहां बहु मंद सरणी पर खराब .NET प्रदर्शन आपके लिए बहुत धीमा है। लेकिन आप अभी भी नए मेटाडेटा को कॉपी और जोड़ने के बिना एक टुकड़ा वापस नहीं कर सकते हैं। – Abel

0

चेक SO पर निम्नलिखित प्रश्न, लेकिन स्वीकार्य उत्तर का उपयोग न करें (आप सभी के बाद प्रतिलिपि नहीं बनाना चाहते हैं), बल्कि मूल सरणी के टुकड़े/उप-भाग के लिए गणनाकर्ता के उपयोग के अन्य विकल्पों का पालन करें।

Array slices in C#

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