তালিকাগুলি উপলভ্য হলে কোনও অ্যারে ব্যবহার করার কোনও কারণ আছে কি? [বন্ধ]


30

দেখে মনে হচ্ছে List<T>সি # তে অ্যারে যা করতে পারে সবকিছু করতে পারে এবং এটি অ্যারের মতো মেমরি এবং পারফরম্যান্সে ঠিক তত দক্ষ seems

তাহলে আমি কেন কখনও অ্যারে ব্যবহার করতে চাইব?

আমি অবশ্যই এমন কেসগুলির বিষয়ে জিজ্ঞাসা করছি না যেখানে কোনও এপিআই বা অন্যান্য বাহ্যিক বাধা (যেমন মূল ফাংশন) আমাকে অ্যারে ব্যবহার করা প্রয়োজন ... আমি কেবল নিজের কোডে নতুন ডেটা স্ট্রাকচার তৈরি করার বিষয়ে জিজ্ঞাসা করছি।


56
প্রয়োগ করতেList<T>
রাচেট ফ্রিক 15

43
is also just as efficient in memory and performance as an array- উম। আপনি এই ধারণাটি কোথা থেকে পেয়েছেন?
ওডে

12
var test = new string[5,5];) এর একাধিক মাত্রা
কিনার্ড

7
সাধারণত ব্যবহৃত বাইট [] অ্যারেও রয়েছে।
এসবস

উত্তর:


26

কাজ করতে যাওয়ার সময় আমি ট্রাক চালাচ্ছি না একই কারণে। আমি এমন কিছু ব্যবহার করি না যা এর বৈশিষ্ট্যগুলি আমি ব্যবহার করব না।

প্রথমে একটি অ্যারে একটি আদিম নির্মাণ যা নিশ্চিতভাবে একটি অ্যারে <<> তালিকার চেয়ে দ্রুত এবং আরও দক্ষ, তাই আপনার যুক্তিটি সত্য নয়। অ্যারে সর্বত্র উপলব্ধ এবং বিভিন্ন ভাষা এবং প্ল্যাটফর্ম ব্যবহার করে বিকাশকারীদের দ্বারা পরিচিত।

সবচেয়ে গুরুত্বপূর্ণ কারণ আমি একটি তালিকা <> পরিবর্তে একটি অ্যারের ব্যবহার পরোক্ষভাবে যে ডেটা হয় দৈর্ঘ্য স্থির । আমি যদি সেই ডেটা সংগ্রহ থেকে কোনও আইটেম যুক্ত বা অপসারণ না করি তবে আমি নিশ্চিত করতে চাই যে প্রকারটি এর প্রতিফলিত হয়।

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

এবং কখনও কখনও কোডের কোনও টুকরোগুলি পোর্ট করা সহজ হয় যা ফ্রেমওয়ার্ক নির্ভর নির্ভর ধরণের পরিবর্তে অ্যারে ব্যবহার করে।


4
অ্যারে List<T>ব্যবহার করে প্রয়োগ করা হয় তা বিবেচনা করে তালিকার চেয়ে অ্যারে কীভাবে "দ্রুত" হয়? যদি আপনি উপাদান গণনা আগেই জানেন (যা আপনাকে জানতে হবে, অ্যারে ব্যবহার করার সময়) তবে তালিকাটি সূচনা করার সময় আপনি সেই জ্ঞানটি ব্যবহার করতে পারেন।
থিওডোরোস চ্যাটজিগিয়ানানাকিস

1
@ থিডোরোস চ্যাটজিগিয়ানানাকিস একটি অ্যারে ব্যবহার করার সময় আমরা মেমরিটি বরাদ্দ করি এবং কেবল অ্যাসাইনমেন্ট করি, প্লেইন ম্যালোক (), কোনও ওভারহেড নেই। আপনি যখন তালিকাটি ব্যবহার করছেন <> আপনি আইটেমগুলি "যুক্ত" করবেন এবং আইটেমগুলি যুক্ত করার পরে তালিকা <> কিছু সীমানা যাচাই করে তোলে এবং এনসুরপ্যাটিসিটি পদ্ধতিতে কল করে যা বর্তমান সক্ষমতা যথেষ্ট না হলে সামগ্রীগুলি অন্য নতুন বরাদ্দ করা অ্যারেতে অনুলিপি করবে। এর অর্থ যদি আপনাকে নতুন মেমরিটি গতিশীলভাবে বরাদ্দ করার প্রয়োজন না হয় তবে তালিকার কার্য সম্পাদন অ্যারের মতো ভাল নয়।
Mert Akcakaya

4
আপনি কি বলছে তা সঠিক নয়, কিন্তু এটি ধরে নেয় যে হয় আমরা উপাদান গণনা পূর্বেই জানি না (যা ক্ষেত্রে, অ্যারে না দরকারী যাহাই হউক না কেন হয়) অথবা আমরা যে কি করতে উপাদান গণনা পূর্বেই জানি কিন্তু আমরা ইচ্ছাকৃতভাবে ব্যবহার করবেন না এটি তালিকার ক্ষেত্রে। আমরা যদি না কাঙ্খিত ক্ষমতা তালিকা আরম্ভ করতে উপাদান গণনা ব্যবহার করেন তখন আমরা শুধুমাত্র একটি অ্যারের বরাদ্দ পেতে (যতক্ষণ না আপনি যে ধারণক্ষমতা পৌঁছানোর), এইভাবে আমরা একই কর্মক্ষমতা খরচ দিতে। আরও সমস্ত সংযোজন (যা অ্যারেগুলিতে মোটেও নেই) ব্যতীত অন্যান্য সমস্ত সাধারণ ক্রিয়াকলাপ সমান (অনুসন্ধান, সূচকে পুনরুদ্ধার, সূচকের মাধ্যমে নিয়োগ) are
থিওডোরোস চ্যাটজিগিয়ানানাকিস

3
@ থিডোরোস চ্যাটজিগিয়ানানাকিস: অ্যারে তালিকার চেয়ে দ্রুত are পরীক্ষা করার জন্য কেবল একটি সাধারণ বেঞ্চমার্ক চালান।
মেহরদাদ

1
@ থিডোরোস চ্যাটিজিগিয়ানানাকিস, হ্যাঁ, তবে এখনও সীমানা পরীক্ষা করা আছে।
Mert Akcakaya

18

আপনার সংগ্রহটি পরিচালনা করতে আপনার অ্যারে দরকার অবশ্যই পরিবর্তনীয় স্ট্রাক্ট এটিগুলি না করে কী করব।

struct EvilMutableStruct { public double X; } // don't do this

EvilMutableStruct[] myArray = new EvilMutableStruct[1];
myArray[0] = new EvilMutableStruct()
myArray[0].X = 1; // works, this modifies the original struct

List<EvilMutableStruct> myList = new List<EvilMutableStruct>();
myList.Add(new EvilMutableStruct());
myList[0].X = 1; // does not work, the List will return a *copy* of the struct

(মনে রাখবেন এমন কিছু ক্ষেত্রে থাকতে পারে যেখানে পরিবর্তনীয় কাঠামোর অ্যারে আকাঙ্ক্ষিত হয়, তবে সাধারণত অন্যান্য সংগ্রহের তুলনায় অ্যারেগুলির মধ্যে পরিবর্তিত স্ট্রকের এই ভিন্ন আচরণটি ত্রুটিগুলির উত্স যা এড়ানো উচিত)


আরও গুরুতরভাবে, আপনি চাইলে আপনার একটি অ্যারের প্রয়োজন রেফারেন্সের মাধ্যমে কোনও উপাদানটি পাস । অর্থাত

Interlocked.Increment(ref myArray[i]);  // works
Interlocked.Increment(ref myList[i]);   // does not work, you can't pass a property by reference

এটি লক-ফ্রি থ্রেডসেফ কোডের জন্য কার্যকর হতে পারে।


আপনি যদি দ্রুত এবং দক্ষতার সাথে আপনার স্থির-আকারের সংগ্রহটি ডিফল্ট মান দিয়ে শুরু করতে চান তবে আপনার একটি অ্যারের প্রয়োজন ।

double[] myArray = new double[1000]; // contains 1000 '0' values
                                     // without further initialisation

List<double> myList = new List<double>(1000) // internally contains 1000 '0' values, 
                                             // since List uses an array as backing storage, 
                                             // but you cannot access those
for (int i =0; i<1000; i++) myList.Add(0);   // slow and inelegant

(দ্রষ্টব্য যে এটির জন্য তালিকার জন্য কোনও কনস্ট্রাক্টর বাস্তবায়ন করা সম্ভব হবে, এটি কেবলমাত্র সি # এই বৈশিষ্ট্যটি সরবরাহ করে না)


আপনি যদি সংগ্রহের অংশগুলি দক্ষতার সাথে অনুলিপি করতে চান তবে আপনাকে একটি অ্যারের প্রয়োজন

Array.Copy(array1, index1, array2, index2, length) // can't get any faster than this

double[,] array2d = new double[10,100];
double[] arraySerialized = new double[10*100];
Array.Copy(array2d, 0, arraySerialized, 0, arraySerialized.Length);
// even works for different dimensions

(আবার, এটি এমন কিছু যা তালিকার জন্যও কার্যকর করা যেতে পারে, তবে এই বৈশিষ্ট্যটি সি # তে বিদ্যমান নেই)


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

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

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

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

15

তাহলে আমি কেন কখনও অ্যারে ব্যবহার করতে চাইব?

কদাচিৎ , আপনার এমন একটি দৃশ্য থাকবে যেখানে আপনি জানেন যে আপনার নির্দিষ্ট সংখ্যক উপাদান প্রয়োজন elements ডিজাইনের দৃষ্টিকোণ থেকে এড়ানো উচিত। আপনার যদি 3 টি জিনিস প্রয়োজন হয় তবে ব্যবসায়ের প্রকৃতির অর্থ হ'ল পরের প্রকাশে আপনার প্রায়শই 4 টি দরকার need

তবুও, যখন এই বিরল দৃশ্যটি প্রকৃতপক্ষে ঘটে থাকে তখন স্থির আকারের আক্রমণকারীটিকে কার্যকর করতে একটি অ্যারে ব্যবহার করা কার্যকর। এটি অন্যান্য প্রোগ্রামারদেরকে একটি সংকেত সরবরাহ করে যে এটি একটি স্থির আকার, এবং অপব্যবহার রোধ করতে সহায়তা করে যেখানে কেউ উপাদান যুক্ত করে বা সরিয়ে দেয় - কোডের অন্য কোথাও প্রত্যাশা ভঙ্গ করে।


23
কোনও কোড লেখার সময় অ্যারেগুলির আকার পাথরে সেট করা থাকে না। এটি একটি রান-টাইম ভেরিয়েবল এবং প্রায়শই হতে পারে। অ্যারে তৈরি হওয়ার পরে এটি কখনই পরিবর্তন হয় না

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

3
@ জনডভোরাকের তালিকাগুলি সঙ্কুচিত বা বৃদ্ধি পেতে পারে এবং নির্দিষ্ট সংখ্যক উপাদানগুলির সাথে জড়িত কোনও প্রসঙ্গে তা বোঝায় না।
ডোভাল

9
কদাচ? সকলেই অতি-জটিল অতি-কনফিগারযোগ্য এন্টারপ্রাইজ মনস্ট্রোসিটিতে কাজ করে না।
হোসনেম

3
নির্দিষ্ট সংখ্যক উপাদান থাকা খুব সাধারণ বিষয়। দৈর্ঘ্যটি একটি ধ্রুবক দ্বারা সংজ্ঞায়িত করা হয়েছে তা নিশ্চিত করুন, সুতরাং পরবর্তী প্রকাশে যখন উপাদানগুলির সংখ্যা 3 থেকে 4 বৃদ্ধি করে, আপনি কেবল ধ্রুবকটি পরিবর্তন করেন এবং এটির উপর নির্ভর করে এমন সমস্ত কিছু অভিযোজিত হয়।
হ্যান্স

9

আপনার প্রশ্নের ইতিমধ্যে এর আগে ইতিমধ্যে উত্তর দেওয়া হয়েছে

এবং মেমরি এবং পারফরম্যান্সে যেমন অ্যারের মতো দক্ষ তেমন দক্ষ বলে মনে হয়।

এটা না। আমি যে প্রশ্নটি যুক্ত করেছি তা থেকে:

List/foreach:  3054ms (589725196)
Array/foreach: 1860ms (589725196)

নির্দিষ্ট গুরুত্বপূর্ণ ক্ষেত্রে অ্যারেগুলি দ্বিগুণ দ্রুত হয়। আমি নিশ্চিত মেমরির ব্যবহারটিও তুচ্ছ-তুচ্ছভাবে পৃথক।

যেহেতু আপনার প্রশ্নের মূল ভিত্তিটি এইভাবে পরাজিত হয়েছে, তাই আমি আপনার প্রশ্নের উত্তরটি ধরে নিচ্ছি। এগুলি ছাড়াও, কখনও কখনও বিন্যাসগুলি আপনাকে উইন 32 এপিআই, বা আপনার জিপিইউর শেডার, বা অন্য কোনও ডটনেট লাইব্রেরি দ্বারা বাধ্য করে।

এমনকি ডটনেটের মধ্যেও কিছু পদ্ধতি গ্রাহ্য করে এবং / অথবা ফেরত অ্যারে (যেমন String.Split)। যার অর্থ হয় আপনার এখনই কলিংয়ের ব্যয় ToListএবং ToArrayসমস্ত সময় খাওয়া উচিত , বা আপনার অবশ্যই অ্যারের সাথে সামঞ্জস্য করতে হবে এবং ব্যবহার করতে হবে, সম্ভবত আপনার নিম্নতর প্রবাহের ব্যবহারকারীদের কাছে এটি প্রচার করে চক্রটি চালিয়ে যেতে হবে কোড।

এই বিষয়ে স্ট্যাক ওভারফ্লো সম্পর্কে আরও প্রশ্নোত্তর:


মজার ব্যাপার হচ্ছে, আউট যদি আপনি সেকেলে সূচীবদ্ধ লুপ (ব্যবহার যে উত্তর পয়েন্ট জন্য পরিবর্তে foreach ) কার্য সম্পাদন পার্থক্য সংক্ষিপ্ত।
user949300

3

অন্যান্য উত্তরে তালিকাভুক্ত কারণগুলি ছাড়াও অ্যারে আক্ষরিক ঘোষণাতে কম অক্ষর লাগে:

var array = new [] { "A", "B", "C" };
var list = new List<string>() { "A", "B", "C" };

এর পরিবর্তে অ্যারে ব্যবহার করা কোডটিকে Listকিছুটা ছোট এবং আরও কিছুটা পাঠযোগ্য করে তোলে যখন (1) আপনাকে কোনও IEnumerable<T>আক্ষরিক, বা (2) যেখানে অন্যান্য কার্যকারিতা পাস করতে হবেList নয় এবং আপনাকে কিছু তালিকার মতো ব্যবহার করতে হবে আক্ষরিক।

আমি ইউনিট পরীক্ষায় মাঝে মধ্যে এটি করেছি।


1
হ্যাঁ যোগ করার জন্য। এটি আপনার কাজ করে একটি আইলিস্ট <T>
এসবেন স্কভ পেডারসেন

+1, প্রায়শই আমার একই ধরণের কয়েকটি ধরণের অবজেক্টের জন্য কিছু অপারেশন হয় যা সংগ্রহের মধ্যে নেই। এটি সহজ, সংক্ষিপ্ত এবং লেখার জন্য স্পষ্ট foreach( var x in new []{ a, b, c ) ) DoStuff( x )বা new []{ a, b, c ).Select( ... )ইত্যাদি
stijn

3

এটি কঠোরভাবে OO দৃষ্টিকোণ থেকে।

যদিও আমি কেবল একটি অ্যারে কাছাকাছি যাওয়ার কারণ সম্পর্কে ভাবতে পারি না, আমি অবশ্যই এমন পরিস্থিতি দেখতে পাচ্ছি যেখানে শ্রেণীর অভ্যন্তরীণ কোনও অ্যারের উপস্থাপনা সম্ভবত সেরা পছন্দ।

অনুরূপ বৈশিষ্ট্যগুলি প্রদান করে এমন অন্যান্য অপশন রয়েছে, প্রসেসিং অনুমোদনের ক্ষেত্রে লুপগুলির জন্য নেস্টেড, ম্যাট্রিক্স উপস্থাপনা, বিটম্যাপস এবং ডেটা ইন্টারলাইভিং অ্যালগরিদমগুলিতে সমস্যা হওয়ার জন্য আরে হিসাবে কোনওটি স্বজ্ঞাত বলে মনে হয় না।

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

আমি যেমন বলেছি, এই ক্ষেত্রে আপনি সম্ভবত তালিকা ব্যবহার করে দূরে সরে যেতে পারেন তবে এটি ইতিমধ্যে জটিল অ্যালগরিদমগুলির শীর্ষে জটিলতার আরও একটি স্তর যুক্ত করে।


3

এটি আসলে অন্যান্য ভাষাগুলির জন্যও তালিকাগুলি রয়েছে (যেমন জাভা বা ভিজ্যুয়াল বেসিক)। এমন ক্ষেত্রে রয়েছে যেখানে আপনাকে অ্যারে ব্যবহার করা প্রয়োজন কারণ একটি পদ্ধতি তালিকার পরিবর্তে অ্যারে প্রদান করে।

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


1
অনেক ভাষায় আলাদা তালিকা এবং অ্যারের সংগ্রহও নেই। অন্যদিকে, list<T>কোথায় vector<T>কাজ করবে তা ব্যবহার করা সি / সি ++ এর একটি বিপর্যয়কর খারাপ ধারণা।
রোবট

1
"যেহেতু একটি পদ্ধতি একটি অ্যারে ফিরিয়ে দেয়" - এটি জাভাটির একটি ভুল তথ্য, প্রোগ্রামারদের "অ্যারে.এএসলিস্ট (এক্স)" দিয়ে কোডটি গুছিয়ে নিতে বাধ্য করে। টি [] হ'ল কমপক্ষে আইটেবল <টি>
কেভিন ক্লাইনে

4
@ স্টিভেন বার্নাপ - এটি সি'র মধ্যে অবশ্যই বিপর্যয়করভাবে খারাপ, কারণ এই কোডটি সংকলনের কোনও উপায় নেই।
পিট বেকার

@ পেটবেকার vector<T> x সি সিতে আমার জন্য বাক্যটি ঠিক জরিমানা করেছে । :-)
সিকিক

দুঃখিত, আমি সি হ্যান্ড-রোলড এর সমতুল্য বোঝাতে চাইছি list<T>। মূলত, আমি বিকাশকারীদের দ্বারা ডিফল্ট অনুসারে কেবল তালিকাগুলি তালিকা ব্যবহার করার সময় প্রচুর পারফরম্যান্স সমস্যা দেখেছি যখন একটি অ্যারে আরও ভাল পছন্দ ছিল।
রোবট

1

ভাল, আমি যে গেমটি লিখছিলাম তার মধ্যে অ্যারে ব্যবহারের সন্ধান পেয়েছি। আমি এটি নির্দিষ্ট সংখ্যক স্লট সহ একটি ইনভেন্টরি সিস্টেম তৈরির জন্য ব্যবহার করেছি। এর বেশ কয়েকটি সুবিধা ছিল:

  1. কোন স্লট শূন্য ছিল তা দেখে এবং দেখে গেমটির অবজেক্টটি কতটা উন্মুক্ত ইনভেন্টরি স্লট ছিল তা আমি ঠিক জানি।
  2. আমি জানতাম প্রতিটি আইটেমটি কী ইনডেক্সে রয়েছে।
  3. এটি তখনও একটি "টাইপড" অ্যারে (আইটেম [] ইনভেন্টরি) ছিল, তাই আমি "আইটেম" টাইপের অবজেক্টগুলিকে যুক্ত / অপসারণ করতে পারতাম।

আমি বুঝতে পেরেছিলাম যে যদি আমাকে আবিষ্কারের আকারটি "বাড়ানোর" দরকার হয়, আমি পুরানো আইটেমগুলিকে নতুন অ্যারে স্থানান্তর করে তা করতে পারতাম, তবে যেহেতু জায়টি স্ক্রিন স্পেস দ্বারা স্থির করা হয়েছিল এবং গতিশীলভাবে এটি আরও বড় করার দরকার নেই আমার / ছোট, এটি যে উদ্দেশ্যে আমি এটি ব্যবহার করছিলাম সেটির জন্য এটি ভালভাবে কাজ করেছে।


1

আপনি যদি কোনও তালিকার সমস্ত উপাদানকে অনুসরণ করছেন তবে না, কোনও অ্যারের প্রয়োজন নেই, 'পরবর্তী' বা স্বেচ্ছাসেবী 'প্রতিস্থাপন ছাড়াই নির্বাচন' জরিমানা করবে।

তবে যদি আপনার অ্যালগরিদমের সংগ্রহের উপাদানগুলিতে এলোমেলো অ্যাক্সেসের প্রয়োজন হয়, তবে, হ্যাঁ, একটি অ্যারে প্রয়োজনীয়।

এটি কিছুটা "কী দরকার?" এর সাথে সামঞ্জস্যপূর্ণ। যুক্তিযুক্ত আধুনিক ভাষায় এটির মোটেই প্রয়োজন হয় না। তবে আপনি যদি বিমূর্ততাগুলি ছুঁড়ে ফেলেন, এক পর্যায়ে, এটি আসলে আপনার কাছে উপলভ্য, অর্থাত্ এই বিমূর্তাগুলি বাস্তবায়নের একমাত্র উপায় হ'ল 'অপ্রয়োজনীয়' বৈশিষ্ট্য। (অবশ্যই, উপমাটি নিখুঁত নয়, কেউ বলে না যে অ্যারেগুলি খারাপ প্রোগ্রামিং অনুশীলন; তারা বুঝতে এবং তাদের সম্পর্কে চিন্তাভাবনা করা সহজ)।


তালিকা <T> এলোমেলো অ্যাক্সেসও সরবরাহ করে। অবশ্যই, এটি একটি অ্যারে দিয়ে প্রয়োগ করা হয়েছে, তবে এটি আপনাকে ব্যবহারকারীর বিরক্ত করার দরকার নেই। সুতরাং সর্বোত্তমভাবে, আপনি অ্যারেগুলি ব্যবহারের একক কারণ প্রস্তাব করেছিলেন: বাস্তবায়নের জন্য List<T>

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

0

উত্তরাধিকারের সামঞ্জস্য।

সমস্ত ফর্ম ব্যক্তিগত অভিজ্ঞতা:

লিগ্যাসি প্রোগ্রামারস - আমার সহকর্মী সর্বত্র অ্যারে ব্যবহার করে, 30+ বছর ধরে করেছেন, আপনার নতুন কল্পনাযুক্ত ধারণার সাথে তার মন পরিবর্তন করার সৌভাগ্য।

লিগ্যাসি কোড - foo (অ্যারে বার []) নিশ্চিত যে আপনি একটি তালিকা / ভেক্টর / সংগ্রহ টোয়ারে ফাংশন ব্যবহার করতে পারেন তবে আপনি যদি সেখানে কোনও অতিরিক্ত বৈশিষ্ট্য ব্যবহার না করেন তবে আরে ব্যবহার করা সহজতর হয়, টাইপ সুইচিং ছাড়াই প্রায়শই বেশি পঠনযোগ্য।

লিগ্যাসি বস - বহু বছর আগে ম্যানেজমেন্টে যাওয়ার আগে আমার বস একজন ভাল প্রোগ্রামার ছিলেন এবং এখনও মনে করেন যে তিনি আপ টু ডেট, "অ্যারে ব্যবহার করছিলেন" একটি সভা সমাপ্ত করতে পারে, ব্যাখ্যা করে যে সংগ্রহটি কীভাবে প্রত্যেকের মধ্যাহ্নভোজনে ব্যয় করতে পারে।


3
সহকর্মীরা 20 বছর পিছনে বাঁক এবং একজন বস যা আপনি কী ধরণের ডেটা ব্যবহার করছেন তা জানতে চায় ... আমার কাজটি আরও খারাপ হতে পারে সে সম্পর্কে নিজেকে স্মরণ করিয়ে দেওয়ার জন্য আমি এই সাইটটিকে ভালবাসি
জোয়েলফ্যান

1
আমরা যা করি তার প্রায় 40% এম্বেডড ডিজাইন যেখানে কেবিতে আলোচনা হয়, তিনি আমাকে বলতে পছন্দ করেন যে হিস্ট স্পোকালাইসড ললকে দ্বিধা করবেন না
স্কিথ

0

1) তালিকার কোনও বহুমাত্রিক সংস্করণ নেই। যদি আপনার ডেটার একাধিক মাত্রা থাকে তবে এটি তালিকাগুলি ব্যবহার করা খুব অদক্ষ।

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

চরম ক্ষেত্রে, মাইনক্রাফ্ট বিবেচনা করুন। (হ্যাঁ, এটি সি # তে লিখিত হয়নি same একই কারণটি প্রযোজ্য))



0

কিছু ধরণের টি এর একটি 100-উপাদান অ্যারে টি টাইপের 100 টি স্বতন্ত্র ভেরিয়েবলকে এনপ্যাপুলেট করে T প্রকারভেদ এবং আর এর ধরণের সামগ্রিকভাবে অ্যারে এভাবে 100 প্রকারের স্বতন্ত্র ভেরিয়েবল এবং আর টাইপ আর এর 100 টি স্বতন্ত্র ভেরিয়েবলকে সংযুক্ত করে; এই ভেরিয়েবলগুলির মধ্যে যে কোনও একটির অন্য কোনওটিকে প্রভাবিত না করে স্বতন্ত্রভাবে অ্যাক্সেস করা যেতে পারে। অ্যারে ব্যতীত আর কোনও সংগ্রহের ধরণের কাঠামোর ক্ষেত্রগুলি স্বাধীন ভেরিয়েবল হিসাবে ব্যবহারের অনুমতি দিতে পারে না।

যদি টি পরিবর্তে Q এবং R টাইপের পাবলিক মিউটেবল ফিল্ডগুলির সাথে শ্রেণীর ধরণের হয়ে থাকে তবে অ্যারের প্রতিটি উপাদান একমাত্র রেফারেন্স , মহাবিশ্বের যে কোনও স্থানে, উদাহরণ হিসাবেঅ্যারে ব্যবহার করে বা মিউটেবল শ্রেণীর ধরণের সংগ্রহের সম্ভাবনা তৈরি করে যে অ্যারে উপাদানগুলির দ্বারা চিহ্নিত ভেরিয়েবলগুলি স্বাধীন নাও হতে পারেT এবং যদি অ্যারের উপাদানগুলির মধ্যে কোনও একটিই থাকে না বাইরের কোনও রেফারেন্স উপস্থিত রয়েছে এমন কোনও জিনিস সনাক্ত করতে সংশোধন করা হবে, তারপরে অ্যারে কার্যকরভাবে টাইপ Q এর 100 টি স্বতন্ত্র ভেরিয়েবল এবং টাইপ আর এর 100 টি স্বতন্ত্র ভেরিয়েবলকে কার্যকরভাবে সজ্জিত করবে collection অ্যারের মধ্যে 100 টাইপ কিউ এবং 100 টাইপ আর এর 100 ভেরিয়েবলগুলি এনক্যাপসুলেট করা হয়, প্রতিটি শ্রেণীর ভেরিয়েবলকে তার নিজস্ব বর্গ অবজেক্টে এনক্যাপুলেট করা তা করার একটি ব্যয়বহুল উপায়। উপরন্তু,

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


0

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

অবশ্যই, অবজেক্টের রেফারেন্সগুলির একটি অ্যারে ক্যাশে হিট থেকে ততটা উপকৃত হতে পারে না, যেহেতু ডিফেরেন্সিং আপনাকে মেমরির যে কোনও জায়গায় নিতে পারে।

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


2
প্রশ্নটি বিশেষত। নেট টাইপ সম্পর্কে জিজ্ঞাসা করে List<T>, যা কোনও লিঙ্কযুক্ত তালিকা ব্যবহার করে প্রয়োগ করা হয় না, তবে একটি অ্যারে ব্যবহার করে (এটি মূলত ArrayList<T>জাভার সমতুল্য )।
সোভিক

-2

আপনি কখন নির্বাচন করবেন Arrayএবং কখন নির্বাচন করবেন সে সম্পর্কে এখানে কয়েকটি গাইডেন্সিনেশন ব্যবহার করতে পারেন List

  • Arrayকোনও পদ্ধতি থেকে ফিরে আসার সময় ব্যবহার করুন ।
  • ব্যবহার Listআপনি যখন রিটার্ন মান (পদ্ধতির অভ্যন্তরে) তৈরি করছেন তখন ভেরিয়েবল হিসাবে । তারপরে .ToArray()পদ্ধতিটি থেকে ফিরে আসার সময় ব্যবহার করুন ।

সাধারণভাবে, Arrayযখন আপনি গ্রাহককে সংগ্রহে আইটেম যুক্ত করতে চান না তখন একটি ব্যবহার করুন। Listআপনি যখন গ্রাহককে সংগ্রহে আইটেম যুক্ত করতে চান তখন ব্যবহার করুন।

Array"স্থিতিশীল" সংগ্রহগুলি নিয়ে Listকাজ করার জন্য বোঝানো হয়েছে যখন "ডায়নামিক" সংগ্রহগুলি নিয়ে কাজ করার জন্য।


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

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

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

@ জুলস আমি অনুমান করি যে এটি তখন আপনার নিজের পছন্দকে নেমে আসে। আমি রিটার্ন মানগুলি স্থির হিসাবে বিবেচনা করতে পছন্দ করি, যেমন আমি Arrayপরিবর্তে ব্যবহার করতে পছন্দ করি List। আপনার ভাবনা শুনে ভালো লাগল!
ড্যানিয়েল লিডস্ট্রোম

আপনি কি উমোডেফাইয়েবললিস্টগুলি ব্যবহারের কথা বিবেচনা করেছেন?
জুলাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.