क्या आकार निर्दिष्ट किए बिना एक खाली सरणी बनाना संभव है?
उदाहरण के लिए, मैंने बनाया:
String[] a = new String[5];
क्या हम बिना आकार के उपरोक्त स्ट्रिंग सरणी बना सकते हैं?
क्या आकार निर्दिष्ट किए बिना एक खाली सरणी बनाना संभव है?
उदाहरण के लिए, मैंने बनाया:
String[] a = new String[5];
क्या हम बिना आकार के उपरोक्त स्ट्रिंग सरणी बना सकते हैं?
जवाबों:
यदि आप एक संग्रह का उपयोग करने जा रहे हैं जिसे आप पहले से आकार नहीं जानते हैं, तो सरणियों से बेहतर विकल्प हैं।
List<string>
इसके बजाय का उपयोग करें - यह आपको आवश्यकतानुसार कई वस्तुओं को जोड़ने की अनुमति देगा और यदि आपको एक सरणी वापस करने की आवश्यकता है, ToArray()
तो चर पर कॉल करें ।
var listOfStrings = new List<string>();
// do stuff...
string[] arrayOfStrings = listOfStrings.ToArray();
आप तो चाहिए एक खाली सारिणी निर्मित आप यह कर सकते हैं:
string[] emptyStringArray = new string[0];
string[]
कि कोई तत्व नहीं है। यदि आप एक्सेस करने की कोशिश करते हैं emptyStringArray[0]
, तो आपको IndexOutOfRangeException
इसे इस्तेमाल करे:
string[] a = new string[] { };
int[] variable = new int[]{}
और उदाहरण के लिए एक लूप में इसका उपयोग करना जैसे foreach (var s in variable){ Console.WriteLine(s);}
कि कोड को संकलित किया जाता है: int[] args1 = new int[0];
और foreach (int num in args1){Console.WriteLine(num);}
। इसलिए उपयोग करने में कोई अंतर नहीं होना चाहिए new int[0]
और new int[]{}
दोनों एक ही कोड में संकलित होने चाहिए।
var
, हालाँकि केवल स्थानीय चर (खेतों के लिए नहीं) के लिए। हालाँकि C # 2.0 (Visual Studio 2005) और इससे पहले, आपको इस उत्तर (या string[] a = new string[0];
) के सिंटैक्स का उपयोग करना था ।
.NET 4.6 में नई विधि का उपयोग करने का पसंदीदा तरीका है Array.Empty
:
String[] a = Array.Empty<string>();
कार्यान्वयन संक्षिप्त है, का उपयोग कर कैसे सामान्य कक्षाओं में स्थिर सदस्यों नेट से व्यवहार करते हैं :
public static T[] Empty<T>()
{
return EmptyArray<T>.Value;
}
// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
public static readonly T[] Value = new T[0];
}
(स्पष्टता के लिए हटाए गए कोड अनुबंध से संबंधित कोड)
यह सभी देखें:
Array.Empty
संदर्भ स्रोत पर स्रोत कोडArray.Empty<T>()
Enumerable.Empty<T>().ToArray()
Array.Empty<T>()
करता नहीं एक सरणी पैदा करते हैं। यह एक पूर्व-आवंटित सरणी का संदर्भ देता है।
आकार के बिना एक सरणी घोषित करने में बहुत अधिक बिंदु नहीं है। एक सरणी आकार के बारे में है । जब आप विशिष्ट आकार की एक सरणी घोषित करते हैं, तो आप एक संग्रह में उपलब्ध स्लॉट की निश्चित संख्या निर्दिष्ट करते हैं जो चीजों को पकड़ सकते हैं, और तदनुसार स्मृति आवंटित की जाती है। इसमें कुछ जोड़ने के लिए, आपको किसी भी तरह मौजूदा सरणी को फिर से संगठित करना होगा (भले ही आप सरणी का आकार बदल रहे हों, इस धागे को देखें )। दुर्लभ मामलों में से एक जहां आप एक खाली सरणी को इनिशियलाइज़ करना चाहेंगे, वहीं एक तर्क के रूप में सरणी को पास करना होगा।
यदि आप एक संग्रह को परिभाषित करना चाहते हैं, जब आप नहीं जानते कि यह किस आकार का हो सकता है, तो सरणी आपकी पसंद नहीं है, लेकिन कुछ ऐसा है List<T>
या समान है।
उस ने कहा, आकार निर्दिष्ट किए बिना एक सरणी घोषित करने का एकमात्र तरीका 0 के खाली सरणी का होना है । हेमंत और एलेक्स डायन दो तरीके प्रदान करते हैं। एक और सरल विकल्प सिर्फ :
string[] a = { };
[ ब्रैकेट के अंदर के तत्वों को स्पष्ट रूप से परिभाषित प्रकार के लिए परिवर्तनीय होना चाहिए, उदाहरण के लिए,string[] a = { "a", "b" };
]
या फिर एक और:
var a = Enumerable.Empty<string>().ToArray();
यहाँ एक और अधिक घोषणात्मक तरीका है :
public static class Array<T>
{
public static T[] Empty()
{
return Empty(0);
}
public static T[] Empty(int size)
{
return new T[size];
}
}
अब आप कॉल कर सकते हैं:
var a = Array<string>.Empty();
//or
var a = Array<string>.Empty(5);
सरल और सुरुचिपूर्ण!
string[] array = {}
array
बस के लिए a
, के रूप में array
एक कीवर्ड जब पूंजीकृत है। एक कीवर्ड नाम को एक चर नाम के रूप में उपयोग करने के लिए केवल बुरा अभ्यास - भले ही मामला अलग हो। और मूल रूप से मेरे उत्तर के समान ही है, जबकि मैं String.Empty
वहां था।
a
बुरा क्यों लगता है?
string[] a = new string[0];
या लघु संकेतन:
string[] a = { };
अब पसंदीदा तरीका है:
var a = Array.Empty<string>();
मैंने एक छोटी नियमित अभिव्यक्ति लिखी है जिसका उपयोग आप विजुअल स्टूडियो में कर सकते हैं यदि आप शून्य-लंबाई के आवंटन को बदलना चाहते हैं जैसे new string[0]
। विज़ुअल स्टूडियो में रेग्युलर एक्सप्रेशन विकल्प के साथ फाइंड स्टूडियो में खोजें (खोजें) का उपयोग करें:
new[ ][a-zA-Z0-9]+\[0\]
अब सभी खोजें या F3 (अगला ढूंढें) और सभी को Array.Empty के साथ बदलें <…> ()!
आप रनटाइम पर सरणी आकार को परिभाषित कर सकते हैं ।
यह आपको सरणी के आकार को गतिशील रूप से गणना करने के लिए करने की अनुमति देगा। लेकिन, एक बार परिभाषित आकार अपरिवर्तनीय है।
Array a = Array.CreateInstance(typeof(string), 5);
int i = 5; string[] a = new string[i];
मैंने कोशिश की थी:
string[] sample = new string[0];
लेकिन मैं इसमें केवल एक स्ट्रिंग सम्मिलित कर सकता हूं, और फिर मुझे एक अपवाद मिल गया।अगर त्रुटि, तो मैंने बस इसके लिए एक आकार रखा, जैसे
string[] sample = new string[100];
या मेरे लिए काम करने का एक और तरीका:
List<string> sample = new List<string>();
सूची के लिए मान निर्दिष्ट करना:
sample.Add(your input);
जैसा कि मुझे पता है कि आप आकार के बिना सरणी नहीं बना सकते, लेकिन आप उपयोग कर सकते हैं
List<string> l = new List<string>()
और फिर l.ToArray()
।
@Nawfal और @Kobi सुझावों का मेल:
namespace Extensions
{
/// <summary> Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. </summary>
public static class Array<T>
{
public static readonly T[] Empty = new T[0];
}
}
उपयोग उदाहरण:
Array<string>.Empty
UPDATE 2019-05-14
(@ जैदर टी को श्रेय)
बेहतर उपयोग। नेट एपीआई:
public static T[] Empty<T> ();
https://docs.microsoft.com/en-us/dotnet/api/system.array.empty?view=netframework-4.8
प्र लागू होता है:
.NET कोर: 3.0 पूर्वावलोकन 5 2.2 2.1 2.0 1.1 1.0
.NET फ्रेमवर्क: 4.8 4.7.2 4.7.1 4.7 4.6.2 4.6.1 4.6
.NET मानक: 2.1 पूर्वावलोकन 2.0 1.6 1.5 1.4 1.3
...
HTH
arr = Array.Empty<string>();
तुम कर सकते हो:
string[] a = { String.Empty };
नोट: ओपी एक आकार निर्दिष्ट करने के लिए नहीं होने का मतलब है, न कि एक सरणी बनाने sizeless
specify
एक आकार से नहीं है, एक सरणी नहीं बनाना है sizeless
।
यहाँ एक वास्तविक दुनिया उदाहरण है। इसमें foundFiles
पहले सरणी को शून्य लंबाई तक आरम्भ करना आवश्यक है ।
(जैसा कि अन्य उत्तरों में जोर दिया गया है: यह एक तत्व को नहीं शुरू करता है और विशेष रूप से सूचकांक शून्य के साथ एक तत्व नहीं है क्योंकि इसका मतलब यह होगा कि सरणी की लंबाई 1 थी। इस पंक्ति के बाद सरणी की लंबाई शून्य है!)।
यदि भाग = string[0]
छोड़ा जाता है, तो संकलक त्रुटि होती है!
इसकी वजह है बिना रीथ्रो के कैच ब्लॉक। C # संकलक कोड पथ को पहचानता है, कि फ़ंक्शन Directory.GetFiles()
एक अपवाद को फेंक सकता है, जिससे कि सरणी अनइंस्टॉल हो सके।
इससे पहले कि कोई कहे, अपवाद को फिर से न पकड़ना गलत त्रुटि से निपटने के लिए होगा: यह सच नहीं है। त्रुटि से निपटने के लिए आवश्यकताओं को पूरा करना होगा।
इस मामले में यह माना जाता है कि कार्यक्रम को एक निर्देशिका के मामले में जारी रहना चाहिए जिसे पढ़ा नहीं जा सकता है, और नहीं टूटना चाहिए - सबसे अच्छा उदाहरण एक निर्देशिका संरचना के माध्यम से कार्य करता है। यहां त्रुटि से निपटने केवल इसे लॉग कर रहा है। बेशक यह बेहतर किया जा सकता है, उदाहरण के GetFiles(Dir)
लिए एक सूची में विफल कॉल के साथ सभी निर्देशिकाओं को इकट्ठा करना , लेकिन यह यहां बहुत दूर ले जाएगा।
यह बताने के लिए पर्याप्त है कि परहेज throw
एक मान्य परिदृश्य है, और इसलिए सरणी को लंबाई शून्य तक आरंभीकृत किया जाना है। कैच ब्लॉक में ऐसा करना पर्याप्त होगा, लेकिन यह खराब शैली होगी।
GetFiles(Dir)
सरणी को आकार बदलने के लिए कॉल ।
string[] foundFiles= new string[0];
string dir = @"c:\";
try
{
foundFiles = Directory.GetFiles(dir); // Remark; Array is resized from length zero
}
// Please add appropriate Exception handling yourself
catch (IOException)
{
Console.WriteLine("Log: Warning! IOException while reading directory: " + dir);
// throw; // This would throw Exception to caller and avoid compiler error
}
foreach (string filename in foundFiles)
Console.WriteLine("Filename: " + filename);