আমি কীভাবে সি # তে খালি অ্যারে শুরু করব?


327

আকার নির্দিষ্ট না করে খালি অ্যারে তৈরি করা কি সম্ভব?

উদাহরণস্বরূপ, আমি তৈরি করেছি:

String[] a = new String[5];

আমরা কি আকার ছাড়াই উপরের স্ট্রিং অ্যারে তৈরি করতে পারি?


2
stackoverflow.com/questions/151936/… আপনি এই লিঙ্কটি পরীক্ষা করে দেখুন, এটি আপনাকে অ্যারের জিনিসগুলি স্পষ্টভাবে বুঝতে সাহায্য করতে পারে
রবি গাদাগ

উত্তর:


434

আপনি যদি এমন কোনও সংগ্রহ ব্যবহার করতে যাচ্ছেন যা আপনি আগে থেকে আকারটি জানেন না, তবে অ্যারের চেয়ে আরও ভাল বিকল্প রয়েছে।

List<string>পরিবর্তে একটি ব্যবহার করুন - এটি আপনাকে যতটা প্রয়োজন আইটেম যুক্ত করার অনুমতি দেবে এবং যদি আপনাকে কোনও অ্যারে ফিরিয়ে দিতে ToArray()হয় তবে ভেরিয়েবলটি কল করুন।

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

যদি আপনাকে অবশ্যই একটি খালি অ্যারে তৈরি করতে হয় তবে আপনি এটি করতে পারেন:

string[] emptyStringArray = new string[0]; 

1
@ ওডেড - স্ট্রিং [] খালি স্ট্রিংআরে = নতুন স্ট্রিং [0]; একটি খালি অ্যারে ফলাফল না, তাই না? দেখে মনে হচ্ছে এটি এমন একটি উপাদান সহ একটি অ্যারে যেখানে সেই উপাদানটি নাল।
rory.ap

11
@ ররিয়াপ - না It এটির ফলস্বরূপ string[]কোনও উপাদান নেই। আপনি যদি অ্যাক্সেস করার চেষ্টা করেন তবে আপনি emptyStringArray[0]পাবেনIndexOutOfRangeException
ওবেদ

@ ওডে - ধন্যবাদ, আমি সি # তে মোটামুটি নতুন। ভিবিতে প্রদত্ত সূচকটি ওপরের সীমানা, উপাদানগুলির সংখ্যা নয়।
rory.ap

1
আপনি কী আরও ভাল বিবেচনা করবেন: var স্ট্রিংস = নতুন স্ট্রিং [] {}; বা var স্ট্রিংস = নতুন স্ট্রিং [0]; বিটিডাব্লু: আমি খালি অ্যারেটিকে পদ্ধতির পরামিতিগুলির জন্য একদম বৈধ ডিফল্ট হিসাবে বিবেচনা করি: সর্বজনীন শূন্য এডিট আইটেমস (আইনিউমেবল <আইটেম> টু এডিট, আইনিউবারেবল <লং> টু ডিলিট = নতুন দীর্ঘ []}})
রিয়েলবার্ট

6
@ রিকো'সিয়া - সি ++ সি # নয়। স্ট্রাস্ট্রাপ তার সি ++ জানে - নিশ্চিত নয় যে সে তার সি # এবং। নেট জিসি জানে। আপনার সাথে কোনও ধর্মযুদ্ধ করতে যাচ্ছে না।
ওডে

181

এটা চেষ্টা কর:

string[] a = new string[] { };

7
এই উত্তরের প্রসারিত করে, আপনি আকার বা প্রকারটি নির্দিষ্ট করে ছাড়াই আইটেমগুলির সাথে অ্যারেও শুরু করতে পারেন, সংকলক আরম্ভকারী থেকে উভয়কেই অনুমান করবে: var a = new [] b "a", "b", "c"}; এটি এখনও একটি দৃ strongly়ভাবে টাইপযুক্ত স্ট্রিং অ্যারে।
নিক ভান্ডারপাইল

1
আনহ্যান্ডলড ব্যতিক্রম: সিস্টেম.আইডেক্সআউটআউটআফ্র্যাঞ্জএক্সেপশন: সূচকের বিন্যাসের বাইরে ডিএসের বাইরে ছিল। অ্যারেক্লাস.মেন (স্ট্রিং [] আরগস) এ। আমি আমার ইনট [পরিবর্তনশীল = নতুন ইনট] [] {}
যোগেশ

6
@ ইয়েজেশ: অদ্ভুত ব্যাপার। উদাহরণস্বরূপ যখন লিখতে 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[]{}
নো

1
@ গ্লেনগার্ডন একেবারে, তবে এটি সি # সংস্করণ 3.0 হিসাবে নতুন (2007 থেকে ভিজ্যুয়াল স্টুডিও ২০০৮ সহ)। varকেবলমাত্র স্থানীয় ভেরিয়েবলগুলির জন্য (ক্ষেত্রের জন্য নয়) যদিও এই সংস্করণটি আরও একটি সাধারণ ফর্ম্যাটকেও মঞ্জুরি দেয় । তবে সি # 2.0 (ভিজ্যুয়াল স্টুডিও 2005) এবং এর আগে, আপনাকে এই উত্তরটির বাক্য গঠন (বা string[] a = new string[0];) ব্যবহার করতে হয়েছিল ।
জেপ্প স্টিগ নীলসেন

113

.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];
}

(স্পষ্টতার জন্য কোড চুক্তি সম্পর্কিত কোড সরানো হয়েছে)

আরো দেখুন:


@ কোল জনসন - সম্পাদনার জন্য ধন্যবাদ, তবে আমি এটি ফিরিয়ে দিয়েছি। আমি উদ্দেশ্য অনুযায়ী এই লাইনগুলি বাদ দিয়েছি: আমি কেবল আকর্ষণীয় বাস্তবায়নটি উদ্ধৃত করতে চেয়েছিলাম। কোড চুক্তি এবং বৈশিষ্ট্যগুলি ঠিক কী হচ্ছে তা বোঝার পথে পান (উত্সের লিঙ্কটিতে অবশ্যই রয়েছে সবকিছু)। স্ট্যাক ওভারফ্লোতে স্ক্রোলিং এড়াতে আমি মন্তব্যে একটি নতুন লাইনও যুক্ত করেছি। আপনি যদি আপত্তি না করেন তবে আমি এটিকে পছন্দ করি। ধন্যবাদ!
কোবি

2
পাঠযোগ্যতার জন্য অবশ্যই একটি উন্নতি থেকে:Enumerable.Empty<T>().ToArray()
ড্যানিয়েল

যদিও এই পদ্ধতিটি বেশিরভাগ ক্ষেত্রে অবশ্যই পছন্দসই, এটি মূল প্রশ্নের উত্তর দেয় না। ওপি একটি খালি অ্যারে তৈরি করতে চায় । একটি অ্যারে তৈরি Array.Empty<T>()করে না । এটি পূর্ব নির্ধারিত অ্যারেতে একটি রেফারেন্স দেয় returns
l33t

33

আপনি 0 টি আকারের সাহায্যে এটি সূচনা করতে পারেন, তবে আপনাকে আকারটি কী হবে তা যখন আপনি অ্যারেতে যুক্ত করতে পারবেন না তখন আপনি এটি পুনরায় চালু করতে হবে।

string[] a = new string[0];

এটিই সঠিক উত্তর
অবজারাক

7

আকার ছাড়াই অ্যারে ঘোষণা করার তেমন কোনও পয়েন্ট নেই। একটি অ্যারে প্রায় আকার । আপনি যখন নির্দিষ্ট আকারের অ্যারে ঘোষণা করেন, আপনি কোনও সংকলনে উপলব্ধ স্লটগুলির নির্দিষ্ট সংখ্যা নির্দিষ্ট করে যা জিনিসগুলি ধরে রাখতে পারে, এবং সেই অনুসারে মেমরি বরাদ্দ করা হয়। এটিতে কিছু যুক্ত করার জন্য আপনাকে অবশ্যই বিদ্যমান অ্যারেটিকে পুনরায় পুনর্নির্মাণ করতে হবে (আপনি যদি অ্যারের আকার পরিবর্তন করছেন তবে এই থ্রেডটি দেখুন )। এমন একটি বিরল ক্ষেত্রে যেখানে আপনি একটি খালি অ্যারে শুরু করতে চান সেটি হল আর্গুমেন্ট হিসাবে অ্যারে পাস করা।

আপনি যখন কোন সংগ্রহটি সংজ্ঞায়িত করতে চান তবে আপনি কী আকারের এটি হতে পারে তা জানেন না, অ্যারে আপনার পছন্দ নয়, তবে এর মতো 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);

1
আপনি যখন প্যারামিটার হিসাবে কোনও অ্যারে পাস করেন তখন ব্যতীত আমি কোনও ব্যবহারের কথা ভাবতে পারি না। প্রতিবিম্বের কয়েকটি ক্ষেত্রে রয়েছে যেখানে কোনও পদ্ধতি অবজেক্টগুলির একটি অ্যারে গ্রহণ করে এবং আপনি ডিফল্ট ক্রিয়াটি কার্যকর করতে খালি অ্যারেটি পাস করতে চাইতে পারেন। আমি আমার উত্তর সম্পাদনা করব।
নওফাল

উদাহরণস্বরূপ আপনার কাছে একটি ইন্টারফেস কার্যকর হয়েছে যা বেশ কয়েকটি ক্লাস দ্বারা বাস্তবায়িত হয় এবং একটি বাস্তবায়নের ক্ষেত্রে পদ্ধতির কোনও উপাদান নেই এবং উদাহরণস্বরূপ একটি খালি অ্যারে প্রদান করে।
ইগনাসিও সোলার গার্সিয়া

@ IgnacioSolerGarcia আমি যদি সেই ক্ষেত্রে খুব কার্যকর পারফরম্যান্সের সমালোচনামূলক অ্যাপ্লিকেশন পাই তবেই আমি একটি অ্যারে ফিরিয়ে আনব। আমি বলব অ্যারেগুলি পুরানো এবং আপনি যদি পারেন তবে এড়ানো উচিত। দেখুন Lippert এই এবং এই তাই প্রশ্ন
nawfal

মনে রাখবেন যে প্রত্যাবর্তিত প্রকারটি অনুমিত হয় তাই অ্যারেটি কেবল পঠনযোগ্য এবং এটি পরিবর্তন করার উদ্দেশ্যে নয়। উদাহরণস্বরূপ আমি কেন এই ক্ষেত্রে একটি তালিকা ফিরিয়ে দেব?
Ignacio সৌর গার্সিয়া

1
একটি খালি অ্যারের জন্য ব্যবহারের কেসটি সহজ - যখন আপনি এটি বস্তুর সাথে পূরণ করতে চান এবং আপনি জানেন না যে আপনি কতগুলি যুক্ত করবেন!
vapcguy

6

সরল ও মার্জিত!

string[] array = {}

মূলধন হিসাবে যখন একটি কীওয়ার্ড হিসাবে আমি arrayঠিক পরিবর্তন করতে হবে । কীওয়ার্ডের নামটি ভেরিয়েবলের নাম হিসাবে ব্যবহার করার জন্য কেবল খারাপ অভ্যাস - কেসটি আলাদা হলেও। এবং মূলত আমার উত্তর হিসাবে একই আমি সেখানে না ছিল ছাড়া । aarrayString.Empty
ভ্যাপকুই

1
1. অ্যারে AC # কীওয়ার্ড নয়। অ্যারে একটি শ্রেণি এবং কোনও কীওয়ার্ড ২ নয় "" ক "এছাড়াও একটি খারাপ অভ্যাস (কীওয়ার্ড ব্যবহারের চেয়েও খারাপ অভ্যাস হতে পারে)
ডিসক্লোজার

প্রযুক্তিগত হচ্ছে। শ্রেণি, কীওয়ার্ড, এটি একটি অবজেক্টের ধরণ নির্ধারণ করে এবং এখনও খারাপ। কেন aখারাপ মনে করেন ?
vapcguy

1
কারণ অ বর্ণনামূলক এবং এক-বর্ণের পরিবর্তনশীল নামগুলি খারাপ অনুশীলন কারণ তারা এগুলি সংজ্ঞায়িত করার পিছনে কারণটি প্রকাশ করে না। "অ্যারে" অবশ্যই "এ" এর চেয়ে ভাল নাম। আরও ভাল নাম হবে "খালিআরে" ray
ডিস্ক্লোজার

4

string[] a = new string[0];

বা সংক্ষিপ্ত স্বরলিপি:

string[] a = { };

এখন পছন্দের উপায় হ'ল:

var a = Array.Empty<string>();

আমি একটি ছোট রেগুলার এক্সপ্রেশন আপনি ভিসুয়াল স্টুডিও ব্যবহার করতে পারেন যদি আপনি শূন্য দৈর্ঘ্যের বরাদ্দ যেমন প্রতিস্থাপন করতে চান লিখেছি new string[0]। নিয়মিত এক্সপ্রেশন বিকল্পটি ভিজ্যুয়াল স্টুডিওতে সন্ধান (অনুসন্ধান) ব্যবহার করুন:

new[ ][a-zA-Z0-9]+\[0\]

এখন সমস্ত বা এফ 3 সন্ধান করুন (পরবর্তী অনুসন্ধান করুন) এবং অ্যারের সাথে সমস্ত প্রতিস্থাপন করুন mpএফটি <…> ()!


3

আপনি রানটাইমে অ্যারের আকার নির্ধারণ করতে পারেন

এটি আপনাকে অ্যারের আকারের গতিশীলভাবে গণনা করতে যা কিছু করতে দেয়। তবে, একবার নির্ধারিত আকারটি পরিবর্তনযোগ্য।

Array a = Array.CreateInstance(typeof(string), 5);

4
কেন সব? রানটাইম এ আপনি সাধারণত চলক থেকে অ্যারের আকারটি সংজ্ঞায়িত করতে পারেন:int i = 5; string[] a = new string[i];
কেভিন ব্রক

ঠিক আছে, আমি জেনারিকগুলির সাথে অনুমান করি যে এটি অপ্রচলিত বলে মনে হয়।
রডারবব

2

আমি চেষ্টা করেছিলাম:

string[] sample = new string[0];

তবে আমি এটিতে কেবল একটি স্ট্রিং couldোকাতে পারলাম এবং তারপরে আমি একটি ব্যতিক্রমওউউটবাউন্ড ত্রুটি পেয়েছি, তাই আমি কেবল এটির জন্য একটি আকার রেখেছি

string[] sample = new string[100];

বা অন্য উপায় যা আমার পক্ষে কাজ করে:

List<string> sample = new List<string>();

তালিকার জন্য মূল্য নির্ধারণ:

sample.Add(your input);

1

আমি জানি যে আপনি আকার ছাড়া অ্যারে করতে পারবেন না, তবে আপনি ব্যবহার করতে পারেন

List<string> l = new List<string>() 

এবং তারপর l.ToArray()


1

@ নওফাল এবং @ কোবি পরামর্শগুলির সংমিশ্রণ:

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


1
নেট কোর 2-তে, এর জন্য ইতিমধ্যে একটি এক্সটেনশন রয়েছেarr = Array.Empty<string>();
জায়েদার

iirc, ইন নেট স্ট্যান্ডার্ড [৪. কিছু কিছু] - রয়েছে।
ShloEmi

0

আপনি করতে পারেন:

string[] a = { String.Empty };

দ্রষ্টব্য: ওপি বলতে বোঝায় কোনও আকার নির্দিষ্ট করে না রাখা, অ্যারেটিকে আকারহীন না করা


7
এটি কি দৈর্ঘ্যের 1 টি স্ট্রিং অ্যারে তৈরি করবে না?
Sumner ইভান্স

সত্য, তবে এটি সাফ হয়ে গেছে। এবং ওপি একটি আকার না জানিয়েই অ্যারে ঘোষণা করতে বলেছে - এটি এটি ফিট করে।
vapcguy

এবং এটি একটি ডাউনটোটের যোগ্য, কেন? ওপি মানে specifyএকটি আকার না থাকা , অ্যারে না করা sizeless
vapcguy

1
@ Vapcguy আমি নীচের দিকে ছিল। আমি দুঃখ করি. আমি আমার উত্তরটি বাতিল করতে আপনার উত্তর সম্পাদনা করেছি। আপনার মন্তব্য প্রশ্নটিকে কিছুটা সন্দেহজনক করে তুলেছে। ওপি বলতে যা বোঝায় তা নিশ্চিত কিনা Not
নওফাল

4
ওপি খালি অ্যারে চেয়েছিল । এই অ্যারেটি খালি নেই।
কিথ

0

এখানে একটি বাস্তব বিশ্বের উদাহরণ। এটিতে 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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.