আকার নির্দিষ্ট না করে খালি অ্যারে তৈরি করা কি সম্ভব?
উদাহরণস্বরূপ, আমি তৈরি করেছি:
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
কেবলমাত্র স্থানীয় ভেরিয়েবলগুলির জন্য (ক্ষেত্রের জন্য নয়) যদিও এই সংস্করণটি আরও একটি সাধারণ ফর্ম্যাটকেও মঞ্জুরি দেয় । তবে সি # 2.0 (ভিজ্যুয়াল স্টুডিও 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>()
করে না । এটি পূর্ব নির্ধারিত অ্যারেতে একটি রেফারেন্স দেয় returns
আকার ছাড়াই অ্যারে ঘোষণা করার তেমন কোনও পয়েন্ট নেই। একটি অ্যারে প্রায় আকার । আপনি যখন নির্দিষ্ট আকারের অ্যারে ঘোষণা করেন, আপনি কোনও সংকলনে উপলব্ধ স্লটগুলির নির্দিষ্ট সংখ্যা নির্দিষ্ট করে যা জিনিসগুলি ধরে রাখতে পারে, এবং সেই অনুসারে মেমরি বরাদ্দ করা হয়। এটিতে কিছু যুক্ত করার জন্য আপনাকে অবশ্যই বিদ্যমান অ্যারেটিকে পুনরায় পুনর্নির্মাণ করতে হবে (আপনি যদি অ্যারের আকার পরিবর্তন করছেন তবে এই থ্রেডটি দেখুন )। এমন একটি বিরল ক্ষেত্রে যেখানে আপনি একটি খালি অ্যারে শুরু করতে চান সেটি হল আর্গুমেন্ট হিসাবে অ্যারে পাস করা।
আপনি যখন কোন সংগ্রহটি সংজ্ঞায়িত করতে চান তবে আপনি কী আকারের এটি হতে পারে তা জানেন না, অ্যারে আপনার পছন্দ নয়, তবে এর মতো 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\]
এখন সমস্ত বা এফ 3 সন্ধান করুন (পরবর্তী অনুসন্ধান করুন) এবং অ্যারের সাথে সমস্ত প্রতিস্থাপন করুন mpএফটি <…> ()!
আপনি রানটাইমে অ্যারের আকার নির্ধারণ করতে পারেন ।
এটি আপনাকে অ্যারের আকারের গতিশীলভাবে গণনা করতে যা কিছু করতে দেয়। তবে, একবার নির্ধারিত আকারটি পরিবর্তনযোগ্য।
Array a = Array.CreateInstance(typeof(string), 5);
int i = 5; string[] a = new string[i];
আমি চেষ্টা করেছিলাম:
string[] sample = new string[0];
তবে আমি এটিতে কেবল একটি স্ট্রিং couldোকাতে পারলাম এবং তারপরে আমি একটি ব্যতিক্রমওউউটবাউন্ড ত্রুটি পেয়েছি, তাই আমি কেবল এটির জন্য একটি আকার রেখেছি
string[] sample = new string[100];
বা অন্য উপায় যা আমার পক্ষে কাজ করে:
List<string> sample = new List<string>();
তালিকার জন্য মূল্য নির্ধারণ:
sample.Add(your input);
আমি জানি যে আপনি আকার ছাড়া অ্যারে করতে পারবেন না, তবে আপনি ব্যবহার করতে পারেন
List<string> l = new List<string>()
এবং তারপর l.ToArray()
।
@ নওফাল এবং @ কোবি পরামর্শগুলির সংমিশ্রণ:
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
আপডেট 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
নেট ফ্রেমওয়ার্ক: 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 };
দ্রষ্টব্য: ওপি বলতে বোঝায় কোনও আকার নির্দিষ্ট করে না রাখা, অ্যারেটিকে আকারহীন না করা
specify
একটি আকার না থাকা , অ্যারে না করা sizeless
।
এখানে একটি বাস্তব বিশ্বের উদাহরণ। এটিতে foundFiles
প্রথমে শূন্য দৈর্ঘ্যের অ্যারে শুরু করা প্রয়োজন ।
(অন্যান্য উত্তরে যেমন জোর দেওয়া হয়েছে: এটি সূচক শূন্যের সাথে একটি উপাদান নয় এবং বিশেষত কোনও উপাদানকে সূচনা করে না কারণ এর অর্থ হবে অ্যারের দৈর্ঘ্য ছিল ১। এই রেখার পরে অ্যারের শূন্য দৈর্ঘ্য রয়েছে!)।
যদি অংশটি = string[0]
বাদ দেওয়া হয় তবে একটি সংকলক ত্রুটি রয়েছে!
রিথ্রো ছাড়াই ক্যাচ ব্লকের কারণে এটি। সি # সংকলক কোড পাথটিকে স্বীকৃতি দেয়, যাতে ফাংশনটি 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);