वहाँ एक ArrayList की तरह एसी # स्थिर सरणी के इलाज के लिए एक तरीका है?

वोट
2

मैं कोड सरणी का उपयोग करता है और दुर्भाग्य से, मैं उनके प्रकार नहीं बदल सकते, है। अगर मैं कर सकता, मैं ArrayLists या कुछ और मैं क्या करने की जरूरत करने के लिए simliar का उपयोग करते हैं, लेकिन मैं नहीं कर सकता। मूल रूप से, मैं सबसे अच्छा तरीका के लिए देख रहा हूँ एक स्थिर सरणी से जोड़ने और तत्वों को हटा सकते हैं। मक्खी पर सरणी के लिए एक आइटम जोड़ने के लिए, मैं, एक नई सरणी कि एक तत्व वर्ष सरणी से बड़ा है बनाने नई सरणी में वर्ष सरणी से आइटम की प्रतिलिपि, और नए आइटम जोड़ने के लिए है। कुछ इस तरह...

public partial class dataStruct 
{
    private myObject[] myStaticArray;
};

private void AddItemToMyArray()
{
    int oldLength = dataStruct.myStaticArray.Length;
    myObject[] newMyObjectArray = new myObject[oldLength + 1];
    for (int i = 0; i < oldLength; i++)
       newMyObjectArray [i] = dataStruct.myStaticArray[i];

    dataStruct.myStaticArray[oldLength] = new myObject();
    dataStruct.myStaticArray = newMyObjectArray;
}

एक आइटम को हटाने के लिए, मैं केवल मैं एक नई सरणी कि एक आइटम छोटा होता है बनाने के एक ही बात करते हैं। यह वास्तव में अक्षम महसूस करता है। किसी को भी, एक बेहतर दृष्टिकोण का सुझाव दे सकता है, तो वहाँ एक है? या किसी अन्य विचार?

आपकी सहायता के लिए पहले से धन्यवाद!

12/03/2009 को 16:59
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


6 जवाब

वोट
6

नहीं - सरणियों हमेशा एक निश्चित आकार रहे हैं। आप को नहीं जोड़ / उन लोगों से प्रविष्टियों को हटा सकते हैं।

यह ठीक है कि प्रतिबंध है ArrayListऔर List<T>आस-पास काम, प्रभावी ढंग से। वे आंतरिक रूप से एक सरणी बनाए रखने, लेकिन यह आम तौर पर सूची की तार्किक आकार से बड़ा है। यदि आप एक में कोई आइटम जोड़ने जब List<T>यह करता है, तो यह कर सकते हैं मौजूदा सरणी से स्थापित हो जाएगा, या यह एक नया, बड़ा सरणी बना सकते हैं और इसे में सामग्री की प्रतिलिपि जाएगा पर्याप्त स्थान उपलब्ध नहीं है यदि। यह परिवर्तन फोन करने वाले यद्यपि के लिए पारदर्शी है - अगर आप अभी भी मूल संदर्भ का उपयोग कर सकते हैं क्योंकि यह सूची और अंतर्निहित सरणी के लिए नहीं एक संदर्भ है।

एक बात जो आपके कोड कर देगा सरल (लेकिन शायद अधिक कुशल नहीं) का उपयोग करने के लिए है Array.Resize । यह आकार परिवर्तन नहीं करता मौजूदा सरणी, लेकिन पुराने सामग्री की एक उथले प्रति के साथ एक नई सरणी देता है, आकार आप अनुरोध पर। नकल एक छोटा सा एक मैनुअल पाश के साथ तुलना में तेजी से हो सकता है लेकिन अक्षमता का मुख्य कारण अभी भी वहाँ है।

12/03/2009 को 17:03
का स्रोत उपयोगकर्ता

वोट
3

दुर्भाग्य से, मैं उनके प्रकार नहीं बदल सकते

क्यों नहीं? केवल उचित जवाब आप एक API आप कार्यों है कि उन्हें वापस जाने के लिए या उन्हें पैरामीटर के रूप में की आवश्यकता होती है के साथ प्रयोग करना चाहिए कि है। उस मामले में, का उपयोग List<T>और कॉल यह है .ToArray()या .AddRange()तरीके के रूप में की जरूरत है।

12/03/2009 को 17:24
का स्रोत उपयोगकर्ता

वोट
3

आप यहाँ एक सरणी का उपयोग क्यों करना चाहते हैं? स्विच करने List<T>, या एक (आप से बीच कुशल इन्हें हटाने / सम्मिलन की जरूरत है) LinkedList<T>

मुझे यकीन है कि अगर आप जिस तरह से मैं यह मतलब में अर्थ कर रहे हैं "स्थिर" नहीं कर रहा हूँ - क्या आप स्पष्ट कर सकते हैं?

जानकारी के लिए, आप उपयोग कर सकते Array.Resize(ref myArray, newSize)हैं, लेकिन वह लगातार परिवर्तन के लिए सही जवाब नहीं है।

12/03/2009 को 17:02
का स्रोत उपयोगकर्ता

वोट
2

यह की आवाज़ से आप डेटा संरचना को बदल नहीं सकते तो सरणियों से निपटने के लिए।

केवल एक चीज आप वास्तव में पर मदद कर सकते हैं कि आप पाश से बचने और क्या कर सकते हैं एक Array.copy है

int oldLength = dataStruct.myStaticArray.Length;
myObject[] newMyObjectArray = new myObject[oldLength + 1];
Array.copy(dataStruct.myStaticArray, newMyObjectArray, oldLength);

dataStruct.myStaticArray[oldLength] = new myObject();
dataStruct.myStaticArray = newMyObjectArray;

संपादित वास्तव में इस काम हो सकता है:

int oldLength = dataStruct.myStaticArray.Length;
Array.Resize(dataStruct.myStaticArray, oldLength+1);
12/03/2009 को 17:09
का स्रोत उपयोगकर्ता

वोट
0

कुछ भी है कि आप बनाने के लिए क्या कर सकते हैं और एक तरह एक सरणी ArrayListया List<T>सिर्फ आप उन वर्गों की फिर से लागू करने हिस्सा (या सभी) खत्म करने के लिए कारण हो रहा है। आपका सबसे अच्छा सबसे अच्छा, के रूप में अन्य उत्तर कहा है निर्मित वर्गों का प्रयोग है।

12/03/2009 को 17:05
का स्रोत उपयोगकर्ता

वोट
0

आप मूल रूप से अपनी खुद की सूची लिख रहे हैं, लेकिन एक कम कुशल तरीके से।

सूची आंतरिक रूप से करता है कि तुम क्या वर्णन कर रहे हैं, लेकिन प्रदर्शन के संबंध में एक बड़ा अंतर के साथ।

जब यह अपने आंतरिक सरणी से पुनर, यह सिर्फ एक नए तत्व जोड़ नहीं है, यह उनमें से एक ब्लॉक कहते हैं। इस तरह से, भविष्य हमेशा पुनः आबंटन की आवश्यकता नहीं है कहते हैं। और क्यों सूची क्षमता हमेशा होता है> = सूची के आकार - इस सूची की 'क्षमता' है।

आप इस करना चाहिए, तो मैं कुछ इसी तरह कर रही सलाह देते हैं। हालांकि, सूची का उपयोग करने जा एक बेहतर विकल्प होगा।

12/03/2009 को 17:04
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more