MyClass[] array;
List<MyClass> list;
যখন একজনের অপরটির চেয়ে বেশি পছন্দ হয় তখন পরিস্থিতিগুলি কী? এবং কেন?
MyClass[] array;
List<MyClass> list;
যখন একজনের অপরটির চেয়ে বেশি পছন্দ হয় তখন পরিস্থিতিগুলি কী? এবং কেন?
উত্তর:
বাস্তবে এটি বিরল, আপনি কোনও অ্যারে ব্যবহার করতে চান। অবশ্যই List<T>
ডেটা যুক্ত / সরাতে চাইলে যে কোনও সময় অবশ্যই ব্যবহার করুন, যেহেতু অ্যারেগুলির আকার পরিবর্তন করা ব্যয়বহুল। যদি আপনি জানেন যে ডেটা নির্দিষ্ট দৈর্ঘ্য, এবং আপনি কিছু খুব নির্দিষ্ট কারণে (বেঞ্চমার্কিংয়ের পরে) মাইক্রো-অপ্টিমাইজ করতে চান , তবে একটি অ্যারে কার্যকর হতে পারে।
List<T>
একটি অফার অনেক একটি অ্যারের তুলনায় অধিক কার্যকারিতার (যদিও LINQ একটু evens পর্যন্ত), এবং প্রায় সবসময় সঠিক পছন্দ। params
যুক্তি বাদে অবশ্যই। ;-p
পাল্টা হিসাবে - List<T>
এক-মাত্রিক; যেখানে আপনার যেমন আয়তক্ষেত্রাকার (ইত্যাদি) অ্যারে রয়েছে int[,]
বা যেমন string[,,]
- তবে কোনও অবজেক্টের মডেলে এই জাতীয় ডেটা (আপনার প্রয়োজনে) মডেলিংয়ের অন্যান্য উপায় রয়েছে।
আরো দেখুন:
এটি বলেছিল, আমি আমার প্রোটোবুফ-নেট প্রকল্পে অ্যারের প্রচুর ব্যবহার করি ; পুরোপুরি পারফরম্যান্সের জন্য:
byte[]
এনকোডিংয়ের জন্য এটি বেশ প্রয়োজনীয়;byte[]
অন্তর্নিহিত স্ট্রিমে (এবং ভিভি) নামানোর আগে আমি একটি স্থানীয় রোলিং বাফার ব্যবহার করি যা আমি পূরণ করি; BufferedStream
ইত্যাদির চেয়ে দ্রুত ;Foo[]
পরিবর্তে List<Foo>
), যেহেতু আকারটি একবার নির্মিত হয়ে যায় এবং এটি খুব দ্রুত হওয়া দরকার।তবে এটি অবশ্যই ব্যতিক্রম; সাধারণ লাইন অফ বিজনেস প্রসেসিংয়ের জন্য, List<T>
প্রতিবার একটি জয়।
সত্যিই কেবল একটি লিঙ্ক যুক্ত করার জন্য উত্তর দেওয়ার জন্য যা আমি অবাক হয়েছি তা এখনও উল্লেখ করা হয়নি: "এরে কিছুটা ক্ষতিকারক বলে বিবেচিত" এরিকের লিপার্টের ব্লগ এন্ট্রি ।
আপনি শিরোনাম থেকে বিচার করতে পারেন যে এটি ব্যবহারিক যেখানেই ব্যবহারিক সংগ্রহগুলি ব্যবহারের পরামর্শ দিচ্ছে - তবে মার্ক যথাযথভাবে উল্লেখ করেছেন, প্রচুর জায়গা রয়েছে যেখানে অ্যারে সত্যিই একমাত্র ব্যবহারিক সমাধান।
প্রস্তাবিত অন্যান্য উত্তর সত্ত্বেও List<T>
, পরিচালনা করার সময় আপনি অ্যারে ব্যবহার করতে চাইবেন:
List<T>
এখানে বাইট অ্যারের চেয়ে এখানে ব্যবহার করার বিরুদ্ধে কি কথা বলছে ?
আপনি যদি না পারফরম্যান্সের সাথে সত্যই উদ্বিগ্ন হন এবং এর অর্থ আমার, "আপনি কেন সি ++ এর পরিবর্তে নেট ব্যবহার করছেন?" আপনার তালিকা <> সাথে আটকে থাকা উচিত। এটি রক্ষণাবেক্ষণ করা সহজ এবং আপনার জন্য পর্দার আড়ালে একটি অ্যারে পুনরায় আকার দেওয়ার সমস্ত নোংরা কাজ করে। (যদি প্রয়োজন হয় তবে তালিকা <> অ্যারের আকারগুলি বেছে নেওয়ার বিষয়ে বেশ স্মার্ট তাই এটির সাধারণত প্রয়োজন হয় না))
অ্যারেগুলির উচিত তালিকা পরিবর্তে ব্যবহার করা যেতে যখন সংগ্রহে নিজেই অপরিবর্তনীয়তা ক্লায়েন্ট & প্রদানকারী কোড (অগত্যা সংগ্রহে মধ্যে আইটেম অপরিবর্তনীয়তা) আর যখন IEnumerable উপযুক্ত নয় মধ্যে চুক্তি অংশ।
উদাহরণ স্বরূপ,
var str = "This is a string";
var strChars = str.ToCharArray(); // returns array
এটা পরিষ্কার যে "স্ট্র্যাচারস" এর পরিবর্তনটি "স্ট্রিং" এর অন্তর্নিহিত প্রকারের নির্বিশেষে বাস্তবায়ন-স্তরের জ্ঞানটিকে মূল "টিআর" অবজেক্টটিকে রূপান্তরিত করবে না।
তবে ধরুন
var str = "This is a string";
var strChars = str.ToCharList(); // returns List<char>
strChars.Insert(0, 'X');
এই ক্ষেত্রে, এটি কোড-স্নিপেট থেকে একা পরিষ্কার নয় যদি সন্নিবেশ পদ্ধতিটি মূল "str" অবজেক্টটিকে রূপান্তরিত করে বা না করে। স্ট্রিংয়ের নির্ধারণের জন্য এটি বাস্তবায়নের স্তরের জ্ঞান প্রয়োজন, যা চুক্তি পদ্ধতির দ্বারা নকশাটি ভেঙে দেয়। স্ট্রিংয়ের ক্ষেত্রে এটি কোনও বড় বিষয় নয়, তবে প্রায় প্রতিটি ক্ষেত্রে এটি একটি বড় চুক্তি হতে পারে। কেবলমাত্র পঠনের জন্য তালিকা সেট করা সাহায্য করে তবে রানটাইম ত্রুটিগুলির ফলাফল, সংকলন-সময় নয়।
To
হয় এমন একটি অবজেক্ট তৈরি করতে যাচ্ছে যা মূল উদাহরণটি সংশোধন করার ক্ষমতা রাখে না, strChars as char[]
যার বিপরীতে বৈধভাবে যদি প্রস্তাব দেওয়া হয় আপনি এখন মূল বস্তুটি সংশোধন করতে সক্ষম হবেন।
str
অভ্যন্তরীণভাবে কোনও অ্যারে ব্যবহার করে এবং ToCharArray
এই অ্যারের কোনও রেফারেন্স প্রদান করে str
তবে মাপ স্থির থাকলেও ক্লায়েন্ট সেই অ্যারের উপাদানগুলি পরিবর্তন করে পরিবর্তন করতে পারে। তবুও আপনি লিখেছেন 'এটা পরিষ্কার যে "স্ট্র্যাচারস" এর পরিবর্তনটি মূল "স্ট্রিং" অবজেক্টটিকে রূপান্তরিত করবে না। আমি এখানে কি মিস করছি? আমি যা দেখতে পাচ্ছি তা থেকে উভয় ক্ষেত্রেই ক্লায়েন্টের অভ্যন্তরীণ উপস্থাপনায় অ্যাক্সেস থাকতে পারে এবং প্রকার নির্বিশেষে, এটি কোনও প্রকারের রূপান্তরকে অনুমতি দেবে।
আমি যদি জানতে পারি যে আমি ঠিক কতটি উপাদানগুলির প্রয়োজন, তবে বলুন আমার 5 টি উপাদান প্রয়োজন এবং কেবল কখনও 5 টি উপাদান থাকে তবে আমি একটি অ্যারে ব্যবহার করি। অন্যথায় আমি কেবল একটি তালিকা ব্যবহার করি <T>।
বেশিরভাগ সময়, List
যথেষ্ট পরিমাণে ব্যবহার করা । এ List
তার ডেটা হ্যান্ডেল করার জন্য একটি অভ্যন্তরীণ অ্যারে ব্যবহার করে এবং List
তার বর্তমান ক্ষমতার চেয়ে আরও বেশি উপাদান যুক্ত করার সময় অ্যারেটি স্বয়ংক্রিয়ভাবে আকার দেয়, এটি অ্যারের তুলনায় এটি আরও সহজ করে তোলে যেখানে আপনাকে আগেই ক্ষমতাটি জানতে হবে।
সি # তে তালিকাগুলি সম্পর্কে আরও তথ্যের জন্য http://msdn.microsoft.com/en-us/library/ms379570(v=vs.80).aspx#datastructures20_1_topic5 দেখুন বা কেবল ডিকম্পাইল করুন System.Collections.Generic.List<T>
।
আপনার যদি বহুমাত্রিক তথ্য প্রয়োজন (উদাহরণস্বরূপ ম্যাট্রিক্স ব্যবহার করা বা গ্রাফিক্স প্রোগ্রামিং), আপনি সম্ভবত এর array
পরিবর্তে যেতে পারেন ।
বরাবরের মতো, স্মৃতি বা পারফরম্যান্স যদি কোনও সমস্যা হয় তবে তা পরিমাপ করুন! অন্যথায় আপনি কোড সম্পর্কে ভ্রান্ত অনুমান করা যেতে পারে।
অ্যারে বনাম তালিকাগুলি একটি সর্বোত্তম রক্ষণাবেক্ষণ বনাম পারফরম্যান্স সমস্যা। প্রায় সমস্ত বিকাশকারী অনুসরণ করে এমন থাম্বের নিয়মটি হ'ল আপনার উভয়ের জন্যই শুটিং করা উচিত, তবে তারা যখন বিরোধে চলে আসে, তখন পারফরম্যান্সের উপরে রক্ষণাবেক্ষণের বিষয়টি বেছে নিন। সেই নিয়মের ব্যতিক্রম হ'ল যখন পারফরম্যান্স ইতিমধ্যে একটি সমস্যা হিসাবে প্রমাণিত হয়েছে। আপনি যদি এই নীতিটি অ্যারে বনামের কাছে নিয়ে যান তবে। তালিকাবদ্ধ করুন, তারপরে আপনি যা পাবেন তা হ'ল:
আপনি কার্য সম্পাদনের সমস্যাগুলি আঘাত না করা অবধি শক্তভাবে টাইপ করা তালিকা ব্যবহার করুন। আপনি যদি কোনও পারফরম্যান্স সমস্যায় পড়ে থাকেন তবে সিদ্ধান্ত নেবেন যে অ্যারেগুলিতে ফেলে দেওয়া আপনার পারফরম্যান্সের সাথে সমাধানের চেয়ে বেশি রক্ষণাবেক্ষণের ক্ষেত্রে এটির ক্ষতির কারণ হতে পারে।
এখনও উল্লেখ করা হয়নি এমন আরেকটি পরিস্থিতি হ'ল যখন কারও কাছে প্রচুর পরিমাণে আইটেম থাকবে, যার প্রত্যেকটিতে সম্পর্কিত-স্বাধীন-স্বাধীন ভেরিয়েবলগুলির একত্রে আটকে থাকবে (উদাহরণস্বরূপ একটি বিন্দুর স্থানাঙ্ক, বা 3 ডি ত্রিভুজের কোণগুলি)। এক্সপোজড-ফিল্ড স্ট্রাকচারের একটি অ্যারে এর উপাদানগুলিকে দক্ষতার সাথে "জায়গায়" সংশোধন করার অনুমতি দেবে - এটি এমন কোনও কিছু যা অন্য কোনও সংগ্রহের ধরণের মাধ্যমে সম্ভব নয়। যেহেতু কাঠামোর একটি অ্যারে তার উপাদানগুলিকে র্যামে ধারাবাহিকভাবে ধরে রাখে, অ্যারের উপাদানগুলিতে ক্রমান্বিত অ্যাক্সেসগুলি খুব দ্রুত হতে পারে। কোডগুলিতে একটি অ্যারের মধ্য দিয়ে অনেকগুলি ক্রমিক পাস করার প্রয়োজন হবে এমন পরিস্থিতিতে কাঠামোগুলির একটি অ্যারে 2: 1 এর একটি ফ্যাক্টর দ্বারা শ্রেণি অবজেক্টের রেফারেন্সের একটি অ্যারে বা অন্যান্য সংগ্রহকে ছাড়িয়ে যেতে পারে; উপরন্তু,
যদিও অ্যারেগুলি পুনরায় আকার পরিবর্তনযোগ্য নয়, কোডের ব্যবহারের পরিমাণের সাথে অ্যারে রেফারেন্স থাকা এবং অ্যারেটিকে প্রয়োজনীয় হিসাবে আরও বড় করে প্রতিস্থাপন করা কঠিন নয়। বিকল্পভাবে, কোনও সহজেই এমন ধরণের কোড কোড লিখতে পারে যা এর মতো আচরণ করে List<T>
তবে এর ব্যাকিং স্টোরটি উন্মোচিত করে, যার ফলে কোনওটি বলা যায় MyPoints.Add(nextPoint);
বা হয় MyPoints.Items[23].X += 5;
। নোট করুন যে কোডটি তালিকার শেষের বাইরে অ্যাক্সেস করার চেষ্টা করলে উত্তরোত্তর অগত্যা একটি ব্যতিক্রম ছুঁড়ে মারবে না, তবে ব্যবহারটি অন্যথায় ধারণাগতভাবে বেশ সমান হবে List<T>
।
Point[] arr;
, কোড বলা সম্ভব, যেমন arr[3].x+=q;
। উদাহরণস্বরূপ ব্যবহার করে List<Point> list
, পরিবর্তে এটি বলা প্রয়োজন Point temp=list[3]; temp.x+=q; list[3]=temp;
। List<T>
কোনও পদ্ধতি থাকলে এটি সহায়ক হবে Update<TP>(int index, ActionByRefRef<T,TP> proc, ref TP params)
। এবং সংকলকগুলি list[3].x+=q;
রূপান্তর করতে পারে {list.Update(3, (ref int value, ref int param)=>value+=param, ref q);
তবে এর মতো কোনও বৈশিষ্ট্য বিদ্যমান নেই।
list[0].X += 3;
তালিকার প্রথম উপাদানটির এক্স সম্পত্তিটিতে 3 যুক্ত করবে। আর list
একটি হল List<Point>
এবং Point
X এবং Y বৈশিষ্ট্য সঙ্গে একটি ক্লাস হয়
.NET- এ তালিকাগুলি অ্যারেগুলিতে মোড়ক রয়েছে এবং অভ্যন্তরীণভাবে একটি অ্যারে ব্যবহার করে। তালিকাগুলিতে অপারেশনগুলির সময় জটিলতা অ্যারেগুলির সাথে একই রকম হয় তবে সমস্ত যুক্ত কার্যকারিতা / তালিকাগুলির সহজলভ্যতা (যেমন স্বয়ংক্রিয় আকার পরিবর্তন এবং তালিকার শ্রেণীর সাথে আসা পদ্ধতিগুলি) এর সাথে আরও কিছুটা ওভারহেড রয়েছে। খুব সুন্দর, আমি না করার বাধ্যতামূলক কারণ না থাকলে সকল ক্ষেত্রে তালিকা ব্যবহারের পরামর্শ দেব , যেমন আপনাকে চূড়ান্তভাবে অনুকূলিত কোড লেখার প্রয়োজন আছে বা অ্যারের আশেপাশে তৈরি অন্যান্য কোডের সাথে কাজ করছেন।
প্রতিটি ডাটা টাইপের বৈশিষ্ট্যগুলির তুলনা করার পরিবর্তে, আমি মনে করি সর্বাধিক ব্যবহারিক উত্তর "আপনার পারফরম্যান্স অর্জনের জন্য পার্থক্যগুলি সম্ভবত IEnumerable
এতটা গুরুত্বপূর্ণ নয়, বিশেষত যেহেতু তারা উভয়ই প্রয়োগ করে , তাই জনপ্রিয় সম্মেলন অনুসরণ করুন এবং একটি ব্যবহার করুন List
যতক্ষণ না আপনার কাছে যুক্তি না রয়েছে, কোন সময়ে আপনি সম্ভবত একটিতে অ্যারে ব্যবহার করার জন্য আপনার কারণটি বজায় রাখতে পারবেন List
। "
পরিচালিত কোডে বেশিরভাগ সময় আপনি সংগ্রহগুলি মাইক্রো-অপ্টিমাইজেশান সম্পর্কে উদ্বিগ্ন হওয়ার সাথে যতটা সম্ভব কাজ করার পক্ষে পক্ষে পক্ষে কাজ করতে চান।
তারা অপ্রিয় হতে পারে তবে গেম প্রকল্পগুলিতে আমি অ্যারে ভক্ত। - কিছু ক্ষেত্রে Iteration গতি গুরুত্বপূর্ণ হতে পারে, আপনি যদি উপাদান অনুযায়ী বেশি কিছু না করে থাকেন তবে অ্যারেতে ভবিষ্যদ্বাণী করা উল্লেখযোগ্যভাবে কম ওভারহেডে থাকে - সহায়ক ফাংশনগুলির সাথে যোগ করা এবং অপসারণ করা তেমন কঠিন নয় - এর ধীর গতিযুক্ত, তবে যেখানে আপনি কেবল একবার এটি তৈরি করেন এটি কোনও ব্যাপার নয় - বেশিরভাগ ক্ষেত্রে কম অতিরিক্ত মেমরি নষ্ট হয় (কেবলমাত্র স্ট্রাক্টের অ্যারেগুলির সাথে গুরুত্বপূর্ণ) - সামান্য কম আবর্জনা এবং পয়েন্টার এবং পয়েন্টার তাড়া করে
বলা হচ্ছে, আমি অনুশীলনে অ্যারেগুলির চেয়ে অনেক বেশিবার তালিকা ব্যবহার করি, তবে তাদের প্রত্যেকেরই জায়গা রয়েছে।
তালিকাটি এমন যেখানে বিল্ট টাইপ রয়েছে যাতে তারা মোড়ক এবং অঙ্কের ওভারহেড অপ্টিমাইজ করতে পারে nice
একটি তালিকা তৈরি করা একটি অ্যারের চেয়ে সহজ। অ্যারেগুলির জন্য, আপনাকে ডেটার সঠিক দৈর্ঘ্য জানতে হবে, তবে তালিকাগুলির জন্য, ডেটার আকার যে কোনও হতে পারে। এবং, আপনি একটি তালিকাটিকে অ্যারেতে রূপান্তর করতে পারেন।
List<URLDTO> urls = new List<URLDTO>();
urls.Add(new URLDTO() {
key = "wiki",
url = "https://...",
});
urls.Add(new URLDTO()
{
key = "url",
url = "http://...",
});
urls.Add(new URLDTO()
{
key = "dir",
url = "https://...",
});
// convert a list into an array: URLDTO[]
return urls.ToArray();
যেহেতু কারও উল্লেখ নেই: সি # তে, একটি অ্যারে একটি তালিকা। MyClass[]
এবং List<MyClass>
উভয় প্রয়োগ IList<MyClass>
। (উদাহরণস্বরূপ void Foo(IList<int> foo)
বলা যেতে পারে Foo(new[] { 1, 2, 3 })
বা Foo(new List<int> { 1, 2, 3 })
)
সুতরাং, আপনি যদি এমন কোনও পদ্ধতি লিখছেন যা List<MyClass>
একটি আর্গুমেন্ট হিসাবে গ্রহণ করে , তবে কেবলমাত্র বৈশিষ্ট্যগুলির উপসেট ব্যবহার করে, আপনি IList<MyClass>
কলারদের সুবিধার পরিবর্তে ঘোষণা করতে চাইতে পারেন।
বিবরণ:
List
, এটি কেবল IList
ইন্টারফেস প্রয়োগ করে ।
এটি সম্পূর্ণরূপে সেই প্রসঙ্গে নির্ভর করে যেখানে ডেটা কাঠামোর প্রয়োজন। উদাহরণস্বরূপ, আপনি যদি তালিকা ব্যবহার করে অন্যান্য ফাংশন বা পরিষেবাগুলি ব্যবহার করতে আইটেম তৈরি করেন তবে এটি সম্পাদন করার সঠিক উপায়।
এখন আপনার যদি আইটেমগুলির একটি তালিকা থাকে এবং আপনি কেবল সেগুলি প্রদর্শন করতে চান, ওয়েব পৃষ্ঠায় অ্যারেতে আপনার যে কন্টেইনারটি ব্যবহার করা দরকার তা বলুন।
IEnumerable<T>
করি - তবে আমি বস্তুগুলিকে বাফার না করে স্ট্রিম করতে পারি।
স্পটটিতে ingালাই করার ক্ষমতা সম্পর্কে এটি উল্লেখযোগ্য।
interface IWork { }
class Foo : IWork { }
void Test( )
{
List<Foo> bb = new List<Foo>( );
// Error: CS0029 Cannot implicitly convert type 'System.Collections.Generic.List<Foo>' to 'System.Collections.Generic.List<IWork>'
List<IWork> cc = bb;
Foo[] bbb = new Foo[4];
// Fine
IWork[] ccc = bbb;
}
তাই এরে অফার একটু বেশি নমনীয়তা যখন রিটার্ন টাইপ বা কাজকর্মের জন্য যুক্তি ব্যবহার করা বিট।
IWork[] GetAllWorks( )
{
List<Foo> fooWorks = new List<Foo>( );
return fooWorks.ToArray( ); // Fine
}
void ExecuteWorks( IWork[] works ) { } // Also accept Foo[]