C # में एक अज्ञात लंबाई की सरणी


81

मैंने अभी C # सीखना शुरू किया है और सरणियों के परिचय में उन्होंने दिखाया है कि एक चर के रूप में एक चर को कैसे स्थापित किया जाए, लेकिन ऐसा लगता है कि किसी को असाइनमेंट में सरणी की लंबाई निर्दिष्ट करनी चाहिए, इसलिए अगर मुझे लंबाई नहीं पता है तो क्या होगा सरणी?

जवाबों:


115

Arrays को एक लंबाई निर्दिष्ट की जानी चाहिए। तत्वों की किसी भी संख्या के लिए अनुमति देने के लिए, Listकक्षा का उपयोग करें ।

उदाहरण के लिए:

List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(11);
myInts.Count // = 3

3
List<int[]> myInts = new List<int[]>();काम कर सकता है।
निकोलस टायलर

1
यदि सरणियों की लंबाई निर्धारित की जानी चाहिए, तो मैं ऐसा क्यों कर सकता हूं: स्ट्रिंग [] गिरफ्तारी = "परीक्षण; मूल्य; अब;" और यह सिर्फ लंबाई निर्धारित करता है? और फिर भी मैं कोड की एक ही लाइन नहीं ले सकता, और चर घोषणा को दूसरी पंक्ति में स्थानांतरित कर सकता हूं।
मैथ्यू_360 20

@ मैथ्यू_360 विभाजन समारोह के अंदर, सरणी को वास्तव में एक निश्चित आकार के साथ बुलाया जा रहा है। उदाहरण: referenceource.microsoft.com/#mscorlib/system/…
Hutch

आपकी प्रतिक्रिया के बारे "Arrays must be assigned a length"में - staticबाहर की एक विधि में Main(), मैंने घोषणा की String[] tokens = nullऔर इसे प्रारंभ नहीं किया, लेकिन मैं कैसे "Hello.World".Split('.')एक System.NullReferenceExceptionत्रुटि प्राप्त किए बिना उस पर कॉल करने में सक्षम था ?
मिन्ह

40

List<>अज्ञात लंबाई का 'सरणी' बनाने के लिए उपयोग करें ।

List<>.ToArray()वास्तविक सरणी वापस करने के लिए उपयोग करें , और नहीं List

var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();

मेरे लिए, सूची ने अज्ञात आकार के मुद्दे को हल किया और फिर .ToArray () ने वह सरणी बनाई जिसकी मुझे आवश्यकता थी।
dev1998

2
System.Collections.Generic का उपयोग कर;
पॉडटेक.आईओ

20

थोड़ी पृष्ठभूमि की जानकारी:

जैसा कि, यदि आप चीजों का एक गतिशील संग्रह करना चाहते हैं, तो उपयोग करें List<T>। आंतरिक रूप से, एक सूची भंडारण के लिए एक सरणी का उपयोग करती है। उस सरणी का किसी भी अन्य सरणी की तरह एक निश्चित आकार है। एक बार एक सरणी के आकार के रूप में घोषित होने के बाद, यह नहीं बदलता है। जब आप किसी आइटम को जोड़ते हैं List, तो वह सरणी में जुड़ जाता है। प्रारंभ में, Listएक सरणी के साथ शुरू होता है , जो मुझे लगता है कि 16 की लंबाई है। जब आप 17 वें आइटम को जोड़ने की कोशिश करते हैं List, तो क्या होता है कि एक नया सरणी आवंटित किया जाता है, यह (मुझे लगता है) पुराने के आकार से दोगुना है , तो 32 आइटम। फिर पुराने सरणी की सामग्री को नए सरणी में कॉपी किया जाता है। तो जबकि Listबाहर के पर्यवेक्षक को गतिशील दिखाई दे सकता है, आंतरिक रूप से इसे नियमों का भी पालन करना पड़ता है।

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


1
यह ठीक वही जानकारी है जो मैं बाद में था। अधिकांश अन्य उत्तरों की तुलना में स्पॉट ऑन और बहुत अधिक जानकारीपूर्ण। +1
कैरी केंडल

16

आप किसी चर के आकार के साथ एक सरणी बना सकते हैं, अर्थात

int size = 50;
string[] words = new string[size]; // contains 50 strings

हालाँकि, वह आकार बाद में नहीं बदल सकता है, यदि आप तय करते हैं कि आपको 100 शब्दों की आवश्यकता है। यदि आपको आकार वास्तव में गतिशील होने की आवश्यकता है, तो आपको एक अलग प्रकार की डेटा संरचना का उपयोग करना होगा। कोशिश करो List


ये सभी अशक्त हैं। string[] words = new string(',', size - 1).Split(',');अब कोशिश करो कि वे साथ शुरू कर रहे हैं ""
बिटरब्लू

3

ArrayList.NET 1.x में एक का उपयोग करें , या List<yourtype>यदि .NET 2.0 या 3.x में एक का उपयोग करें ।

में उनके लिए खोज System.Collectionsऔर System.Collections.Generics


2

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

उपयोगकर्ता नाम, कुल बिल

यह आपको केवल मूल्य को खोजने और अपडेट करने के लिए बहुत सारे बिल्ट इन टूल्स देता है।


1
var yummy = new List<string>();
while(person.FeelsHappy()) {
    yummy.Add(person.GetNewFavoriteFood());
}
Console.WriteLine("Sweet! I have a list of size {0}.", list.Count);
Console.WriteLine("I didn't even need to know how big to make it " +
    "until I finished making it!");


1

संक्षेप में, संग्रह और जेनरिक का उपयोग करें।

यह किसी भी C # डेवलपर के लिए जरूरी है, यह सीखने के लिए समय बिताने लायक है :)


1

जैसा कि ऊपर बताया गया है, सामान्य सूची <> इसे करने का सबसे अच्छा तरीका है।

यदि आप .NET 1. * में फंस गए हैं, तो आपको इसके बजाय ArrayList वर्ग का उपयोग करना होगा। यह संकलन-समय प्रकार की जाँच नहीं करता है और आपको कास्टिंग - गन्दा भी जोड़ना होगा।

क्रमिक संस्करणों ने विभिन्न रूपों को भी लागू किया है - जिसमें थ्रेड सेफ वेरिएंट शामिल हैं।


1

यदि आपको वास्तव में सूची के बजाय एक सरणी का उपयोग करने की आवश्यकता है, तो आप एक ऐसा सरणी बना सकते हैं, जिसका आकार रन टाइम में गणना की जाती है ...

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

int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];

इसी तरह एक आयाम सरणी के लिए, मैं लिखूंगा: var x = new int [n];
केन जंका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.