অ্যারে বনাম তালিকা <টি>: কখন ব্যবহার করবেন?


592
MyClass[] array;
List<MyClass> list;

যখন একজনের অপরটির চেয়ে বেশি পছন্দ হয় তখন পরিস্থিতিগুলি কী? এবং কেন?


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

9
আমি যদি ভুল না করে থাকি তবে তালিকা <> অভ্যন্তরীণ কাঠামো হিসাবে অ্যারে রয়েছে। যখনই অভ্যন্তরীণ অ্যারে পূর্ণ হয় এটি কেবল কন্টেন্টটি এমন অ্যারেতে অনুলিপি করে যা আকারের দ্বিগুণ (বা বর্তমানের আকারের কিছু ধ্রুবক বার)। en.wikipedia.org/wiki/Dynamic_array
Ykok

ইয়োকোক: আপনি যা বলছেন তা সঠিক বলে মনে হচ্ছে, আমি সূত্রের কোডের সন্ধান পেয়েছি <> এখানে
ক্যারল

19
@ গিমেল আর্গুমেন্ট যে অ্যারেগুলি অপ্রচলিত সম্ভবত কিছুটা সাহসী
awdz9nld

উত্তর:


580

বাস্তবে এটি বিরল, আপনি কোনও অ্যারে ব্যবহার করতে চান। অবশ্যই List<T>ডেটা যুক্ত / সরাতে চাইলে যে কোনও সময় অবশ্যই ব্যবহার করুন, যেহেতু অ্যারেগুলির আকার পরিবর্তন করা ব্যয়বহুল। যদি আপনি জানেন যে ডেটা নির্দিষ্ট দৈর্ঘ্য, এবং আপনি কিছু খুব নির্দিষ্ট কারণে (বেঞ্চমার্কিংয়ের পরে) মাইক্রো-অপ্টিমাইজ করতে চান , তবে একটি অ্যারে কার্যকর হতে পারে।

List<T>একটি অফার অনেক একটি অ্যারের তুলনায় অধিক কার্যকারিতার (যদিও LINQ একটু evens পর্যন্ত), এবং প্রায় সবসময় সঠিক পছন্দ। paramsযুক্তি বাদে অবশ্যই। ;-p

পাল্টা হিসাবে - List<T>এক-মাত্রিক; যেখানে আপনার যেমন আয়তক্ষেত্রাকার (ইত্যাদি) অ্যারে রয়েছে int[,]বা যেমন string[,,]- তবে কোনও অবজেক্টের মডেলে এই জাতীয় ডেটা (আপনার প্রয়োজনে) মডেলিংয়ের অন্যান্য উপায় রয়েছে।

আরো দেখুন:

এটি বলেছিল, আমি আমার প্রোটোবুফ-নেট প্রকল্পে অ্যারের প্রচুর ব্যবহার করি ; পুরোপুরি পারফরম্যান্সের জন্য:

  • এটি অনেকটা বিট-শিফটিং করে, তাই byte[]এনকোডিংয়ের জন্য এটি বেশ প্রয়োজনীয়;
  • byte[]অন্তর্নিহিত স্ট্রিমে (এবং ভিভি) নামানোর আগে আমি একটি স্থানীয় রোলিং বাফার ব্যবহার করি যা আমি পূরণ করি; BufferedStreamইত্যাদির চেয়ে দ্রুত ;
  • এটি অভ্যন্তরীণভাবে অবজেক্টগুলির একটি অ্যারে-ভিত্তিক মডেল ব্যবহার করে ( Foo[]পরিবর্তে List<Foo>), যেহেতু আকারটি একবার নির্মিত হয়ে যায় এবং এটি খুব দ্রুত হওয়া দরকার।

তবে এটি অবশ্যই ব্যতিক্রম; সাধারণ লাইন অফ বিজনেস প্রসেসিংয়ের জন্য, List<T>প্রতিবার একটি জয়।


8
আকার পরিবর্তন সম্পর্কে যুক্তিটি সম্পূর্ণ বৈধ। তবে কোনও আকার পরিবর্তন করার প্রয়োজন নেই এমন সময়েও লোক তালিকাগুলি পছন্দ করে। এই পরবর্তী ক্ষেত্রে, একটি শক্ত, যৌক্তিক যুক্তি আছে বা এটি "অ্যারে ফ্যাশনের বাইরে" ছাড়া আর কিছুই নয়?
ফ্রেডরিক দ্য ফুল

6
"আপনি ডেটা যুক্ত করতে / মুছে ফেলতে চাইলে অবশ্যই <T> একটি তালিকা ব্যবহার করুন, কারণ অ্যারেগুলির আকার পরিবর্তন করা ব্যয়বহুল।" তালিকা <T> অভ্যন্তরীণভাবে একটি অ্যারে ব্যবহার করে। আপনি কি লিঙ্কডলিস্ট <টি> ভাবছেন?
ড্যান-জিএফ

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

12
@ এমননার্বোন আপনি যদি এই বৈশিষ্ট্যগুলি ব্যবহার না করেন তবে আমি আপনাকে গ্যারান্টি দিতে পারি যে তারা আপনাকে ক্ষতিগ্রস্থ করবে না ... তবে: সংগ্রহের সংখ্যা যা কখনও পরিবর্তনের প্রয়োজন হয় না , আমার অভিজ্ঞতার তুলনায় এটি অনেক কম my রূপান্তরিত
মার্ক গ্রাভেল

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

121

সত্যিই কেবল একটি লিঙ্ক যুক্ত করার জন্য উত্তর দেওয়ার জন্য যা আমি অবাক হয়েছি তা এখনও উল্লেখ করা হয়নি: "এরে কিছুটা ক্ষতিকারক বলে বিবেচিত" এরিকের লিপার্টের ব্লগ এন্ট্রি

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


2
অবশেষে প্রায় 3 বছর পরে এটি পড়ার কাছাকাছি পেয়েছি haha। ভাল নিবন্ধ তাহলে, এখন ভাল নিবন্ধ। :)
স্পেনসার রুপোর্ট

21

প্রস্তাবিত অন্যান্য উত্তর সত্ত্বেও List<T>, পরিচালনা করার সময় আপনি অ্যারে ব্যবহার করতে চাইবেন:

  • চিত্র বিটম্যাপ ডেটা
  • অন্যান্য নিম্ন-স্তরের ডেটা-স্ট্রাকচার (যেমন নেটওয়ার্ক প্রোটোকল)

1
নেটওয়ার্ক প্রোটোকল কেন? আপনি কি এখানে বরং কাস্টম স্ট্রাকচার ব্যবহার করবেন না এবং তাদের একটি বিশেষ সিরিয়ালাইজার বা একটি স্পষ্ট স্মৃতি বিন্যাস দেবেন না? তদ্ব্যতীত, List<T>এখানে বাইট অ্যারের চেয়ে এখানে ব্যবহার করার বিরুদ্ধে কি কথা বলছে ?
কনরাড রুডলফ

8
@ কনরাড - ভাল, স্টার্টসদের জন্য, স্ট্রিম.ড্রয়েড এবং স্ট্রিম.বাইটের সাথে কাজ করুন [], এনকোডিং ইত্যাদির মতো ...
মার্ক গ্র্যাভেল

12

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


15
"আপনি কেন ব্যবহার করছেন? সি ++ এর পরিবর্তে নেট?" এক্সএনএ
বেংট

6

অ্যারেগুলির উচিত তালিকা পরিবর্তে ব্যবহার করা যেতে যখন সংগ্রহে নিজেই অপরিবর্তনীয়তা ক্লায়েন্ট & প্রদানকারী কোড (অগত্যা সংগ্রহে মধ্যে আইটেম অপরিবর্তনীয়তা) আর যখন 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তবে মাপ স্থির থাকলেও ক্লায়েন্ট সেই অ্যারের উপাদানগুলি পরিবর্তন করে পরিবর্তন করতে পারে। তবুও আপনি লিখেছেন 'এটা পরিষ্কার যে "স্ট্র্যাচারস" এর পরিবর্তনটি মূল "স্ট্রিং" অবজেক্টটিকে রূপান্তরিত করবে না। আমি এখানে কি মিস করছি? আমি যা দেখতে পাচ্ছি তা থেকে উভয় ক্ষেত্রেই ক্লায়েন্টের অভ্যন্তরীণ উপস্থাপনায় অ্যাক্সেস থাকতে পারে এবং প্রকার নির্বিশেষে, এটি কোনও প্রকারের রূপান্তরকে অনুমতি দেবে।
টিম এমবি

3

আমি যদি জানতে পারি যে আমি ঠিক কতটি উপাদানগুলির প্রয়োজন, তবে বলুন আমার 5 টি উপাদান প্রয়োজন এবং কেবল কখনও 5 টি উপাদান থাকে তবে আমি একটি অ্যারে ব্যবহার করি। অন্যথায় আমি কেবল একটি তালিকা ব্যবহার করি <T>।


1
যে উপাদানগুলির সংখ্যা আপনি জানেন সে ক্ষেত্রে আপনি কেন একটি তালিকা <T> ব্যবহার করবেন না?
অলিভার

3

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

সি # তে তালিকাগুলি সম্পর্কে আরও তথ্যের জন্য http://msdn.microsoft.com/en-us/library/ms379570(v=vs.80).aspx#datastructures20_1_topic5 দেখুন বা কেবল ডিকম্পাইল করুন System.Collections.Generic.List<T>

আপনার যদি বহুমাত্রিক তথ্য প্রয়োজন (উদাহরণস্বরূপ ম্যাট্রিক্স ব্যবহার করা বা গ্রাফিক্স প্রোগ্রামিং), আপনি সম্ভবত এর arrayপরিবর্তে যেতে পারেন ।

বরাবরের মতো, স্মৃতি বা পারফরম্যান্স যদি কোনও সমস্যা হয় তবে তা পরিমাপ করুন! অন্যথায় আপনি কোড সম্পর্কে ভ্রান্ত অনুমান করা যেতে পারে।


1
হাই, আপনি কী ব্যাখ্যা করতে পারেন যে "তালিকার দেখার সময় ও (এন) হবে কেন" সত্য? আমি যতদূর জানি লিস্ট <T> পর্দার পিছনে অ্যারে ব্যবহার করে।
ড্রাগনফ্লাই

1
@ ড্রাগনফ্লাই আপনি পুরোপুরি ঠিক বলেছেন। উত্স । সেই সময়, আমি ধরে নিয়েছিলাম যে বাস্তবায়নটি পয়েন্টার ব্যবহার করেছে, তবে আমি অন্যথায় শিখেছি। উপরের লিঙ্কটি থেকে: 'এই সম্পত্তির মূল্য পুনরুদ্ধার করা একটি ও (1) অপারেশন; সম্পত্তি নির্ধারণ করাও একটি ও (1) অপারেশন। '
সুন রিভার্স

2

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

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


1

এখনও উল্লেখ করা হয়নি এমন আরেকটি পরিস্থিতি হ'ল যখন কারও কাছে প্রচুর পরিমাণে আইটেম থাকবে, যার প্রত্যেকটিতে সম্পর্কিত-স্বাধীন-স্বাধীন ভেরিয়েবলগুলির একত্রে আটকে থাকবে (উদাহরণস্বরূপ একটি বিন্দুর স্থানাঙ্ক, বা 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>এবং PointX এবং Y বৈশিষ্ট্য সঙ্গে একটি ক্লাস হয়
কার্ল

1

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


0

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

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


0

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

বলা হচ্ছে, আমি অনুশীলনে অ্যারেগুলির চেয়ে অনেক বেশিবার তালিকা ব্যবহার করি, তবে তাদের প্রত্যেকেরই জায়গা রয়েছে।

তালিকাটি এমন যেখানে বিল্ট টাইপ রয়েছে যাতে তারা মোড়ক এবং অঙ্কের ওভারহেড অপ্টিমাইজ করতে পারে nice


0

একটি তালিকা তৈরি করা একটি অ্যারের চেয়ে সহজ। অ্যারেগুলির জন্য, আপনাকে ডেটার সঠিক দৈর্ঘ্য জানতে হবে, তবে তালিকাগুলির জন্য, ডেটার আকার যে কোনও হতে পারে। এবং, আপনি একটি তালিকাটিকে অ্যারেতে রূপান্তর করতে পারেন।

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();

0

যেহেতু কারও উল্লেখ নেই: সি # তে, একটি অ্যারে একটি তালিকা। 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ইন্টারফেস প্রয়োগ করে ।
রুফাস এল

-1

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

এখন আপনার যদি আইটেমগুলির একটি তালিকা থাকে এবং আপনি কেবল সেগুলি প্রদর্শন করতে চান, ওয়েব পৃষ্ঠায় অ্যারেতে আপনার যে কন্টেইনারটি ব্যবহার করা দরকার তা বলুন।


1
আপনার যদি আইটেমের একটি তালিকা থাকে এবং আপনি কেবল সেগুলি প্রদর্শন করতে চান, তবে আপনার ইতিমধ্যে উপস্থিত তালিকাটি ব্যবহার করে কী ভুল? এখানে একটি অ্যারের অফার কি হবে?
মার্ক গ্র্যাভেল

1
এবং "অন্যান্য ফাংশন বা পরিষেবাদি দ্বারা আইটেমগুলি ব্যবহার করার জন্য" তৈরি করার জন্য, আমি এটির সাথে একটি পুনরাবৃত্তকারী ব্লকটি পছন্দ IEnumerable<T>করি - তবে আমি বস্তুগুলিকে বাফার না করে স্ট্রিম করতে পারি।
মার্ক গ্র্যাভেল

-1

স্পটটিতে 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[]

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