আমি সেগুলি অনেকগুলি একইভাবে ব্যবহার করতে দেখেছি এবং আমি চিন্তিত যে আমি ডিজাইনের এমন কোনও পথে নামতে যাচ্ছি যা আমি যদি আরও ভাল না বুঝতে পারি তবে তা অপরিবর্তনীয়। এছাড়াও, আমি নেট ব্যবহার করছি।
আমি সেগুলি অনেকগুলি একইভাবে ব্যবহার করতে দেখেছি এবং আমি চিন্তিত যে আমি ডিজাইনের এমন কোনও পথে নামতে যাচ্ছি যা আমি যদি আরও ভাল না বুঝতে পারি তবে তা অপরিবর্তনীয়। এছাড়াও, আমি নেট ব্যবহার করছি।
উত্তর:
Collection<T>
একটি স্বনির্ধারিত মোড়কের প্রায় IList<T>
। IList<T>
সিল না করা অবস্থায় এটি কোনও কাস্টমাইজেশন পয়েন্ট সরবরাহ করে না। Collection<T>
এর পদ্ধতিগুলি ডিফল্টরূপে মানক IList<T>
পদ্ধতিতে অর্পিত হয় তবে আপনি যা চান সহজেই তা ওভাররাইড করা যায়। আইএললিস্ট Collection<T>
দিয়ে সম্পন্ন হতে পারে বলে আমি বিশ্বাস করি না এর মধ্যে ইভেন্টগুলি ওয়্যারআপ করাও সম্ভব ।
সংক্ষেপে, সত্যের পরে এটি প্রসারিত করা অনেক সহজ, যার অর্থ সম্ভবত অনেক কম রিফ্যাক্টরিং হতে পারে।
IList
, IList<T>
, List<T>
ইত্যাদি সংক্ষেপে, আপনি কোন ধারণা তা বলা হবে না। পলিমারফিজম এটিকে ঠিক করে।
ObservableCollection<T>
একটি উদাহরণ হিসাবে যুক্ত করতে চাইতে পারেন যেখানে পরিবর্তনের বিষয়ে অবহিত করার জন্য পদ্ধতিগুলি ওভার্রাইড করা হয় ।
সি # তে, একটি ব্যাগ অবজেক্টের প্রতিনিধিত্ব করার জন্য তিনটি ধারণা রয়েছে। বৈশিষ্ট্যগুলি বাড়ানোর জন্য, সেগুলি হ'ল:
গণনার কোনও আদেশ নেই। আপনি সেট থেকে আইটেমগুলি যোগ বা সরাতে পারবেন না। এমনকি আপনি সেটে আইটেমের একটি গণনাও পেতে পারেন না। এটি আপনাকে একের পর এক সেটের প্রতিটি আইটেমকে কঠোরভাবে অ্যাক্সেস করতে দেয়।
সংগ্রহ একটি পরিবর্তনযোগ্য সেট। আপনি সেট থেকে অবজেক্টগুলি যুক্ত করতে এবং সরাতে পারেন, আপনি সেটে আইটেমগুলির গণনাও পেতে পারেন। তবে এখনও কোনও অর্ডার নেই, এবং কারণ কোনও আদেশ নেই: সূচি দ্বারা কোনও আইটেম অ্যাক্সেস করার উপায় নেই বা বাছাইয়ের কোনও উপায় নেই।
তালিকা হ'ল বস্তুর একটি আদেশযুক্ত সেট। আপনি তালিকাটি বাছাই করতে পারেন, সূচি অনুসারে আইটেমগুলি অ্যাক্সেস করতে পারেন, সূচি অনুসারে আইটেমগুলি সরিয়ে ফেলতে পারেন।
আসলে, এগুলির ইন্টারফেসগুলি দেখার সময় তারা একে অপরকে গড়ে তোলে:
interface IEnumerable<T>
GetEnumeration<T>
interface ICollection<T> : IEnumerable<T>
Add
Remove
Clear
Count
interface IList<T> = ICollection<T>
Insert
IndexOf
RemoveAt
ভেরিয়েবল বা পদ্ধতি পরামিতি ঘোষণাকালে, আপনার ব্যবহারের পছন্দ করা উচিত
ধারণার উপর ভিত্তি করে আপনাকে অবজেক্টের সেটটি করতে হবে।
যদি আপনাকে কেবল তালিকার প্রতিটি বস্তুর জন্য কিছু করতে সক্ষম হতে হয় তবে আপনার কেবল প্রয়োজন IEnumerable
:
void SaveEveryUser(IEnumerable<User> users)
{
for User u in users
...
}
আপনি গ্রাহ্য না ব্যবহারকারীরা একটি রাখা হয় যদি না List<T>
, Collection<T>
, Array<T>
বা অন্য কিছু। আপনার কেবল IEnumerable<T>
ইন্টারফেসের প্রয়োজন ।
যদি আপনাকে কোনও সেটে আইটেমগুলি যোগ করতে, অপসারণ করতে বা গণনা করতে সক্ষম হতে হয় তবে সংগ্রহটি ব্যবহার করুন :
ICollection<User> users = new Collection<User>();
users.Add(new User());
যদি আপনি কোনও সাজানোর অর্ডার সম্পর্কে যত্নশীল হন এবং ক্রমটি সঠিক হওয়ার প্রয়োজন হয় তবে একটি তালিকা ব্যবহার করুন :
IList<User> users = FetchUsers(db);
চার্ট আকারে:
| Feature | IEnumerable<T> | ICollection<T> | IList<T> |
|------------------------|----------------|----------------|----------|
| Enumerating items | X | X | X |
| | | | |
| Adding items | | X | X |
| Removing items | | X | X |
| Count of items | | X | X |
| | | | |
| Accessing by index | | | X |
| Removing by indexx | | | X |
| Getting index of item | | | X |
List<T>
এবং Collection<T>
এ System.Collections.Generic
দুটি ক্লাস যে এই ইন্টারফেসগুলি বাস্তবায়ন হয়; তবে তারা একমাত্র ক্লাস নয়:
ConcurrentBag<T>
বস্তুর অর্ডারযুক্ত ব্যাগ ( IEnumerable<T>
)LinkedList<T>
এমন একটি ব্যাগ যেখানে আপনাকে সূচি ( ICollection
) দ্বারা আইটেম অ্যাক্সেস করার অনুমতি দেওয়া হয় না ; তবে আপনি সংগ্রহ থেকে আইটেমগুলি ইচ্ছামত যুক্ত করতে এবং মুছতে পারেনSynchronizedCollection<T>
অর্ডার করা সংগ্রহে, যেখানে আপনি সূচি অনুসারে আইটেমগুলি যুক্ত / সরাতে পারবেনসুতরাং আপনি সহজেই পরিবর্তন করতে পারেন:
IEnumerable<User> users = new SynchronizedCollection<User>();
SaveEveryUser(users);
আপনার প্রয়োজনীয় ধারণাটি চয়ন করুন , তারপরে ম্যাচিং ক্লাসটি ব্যবহার করুন।
ICollection<T>
এবং IList<T>
। বিভিন্ন কংক্রিট বাস্তবায়ন আলাদাভাবে আচরণ করতে পারে। উদাহরণস্বরূপ, আপনি যদি List<T>
তার IEnumerable<T>
ইন্টারফেসের মাধ্যমে কোনও অ্যাক্সেস করেন তবে তালিকার আইটেমগুলি যুক্ত করতে, অপসারণ, বাছাই করতে বা গণনা করার কোনও উপায় আপনার নেই।
List<T>
অ্যাপ্লিকেশন কোডের মধ্যে অভ্যন্তরীণ ব্যবহারের জন্য উদ্দিষ্ট। আপনার গ্রহণযোগ্য বা ফিরে আসার মতো সরকারী API গুলি লেখা এড়ানো উচিত List<T>
(পরিবর্তে একটি সুপারক্লাস বা কোনও সংগ্রহ ইন্টারফেস ব্যবহার করার বিষয়ে বিবেচনা করুন)।
Collection<T>
কাস্টম সংগ্রহের জন্য একটি বেস ক্লাস পরিবেশন করে (যদিও এটি সরাসরি ব্যবহার করা যেতে পারে)।
আপনার প্রয়োজনে Collection<T>
নির্দিষ্ট বৈশিষ্ট্য না থাকলে আপনার কোডটি ব্যবহার করার বিষয়টি বিবেচনা করুন List<T>
।
উপরেরটি কেবলমাত্র সুপারিশগুলি।
[এর থেকে অভিযোজিত: ফ্রেমওয়ার্ক ডিজাইনের গাইডলাইন, দ্বিতীয় সংস্করণ]
Dictionary<string, List<string>>
রিটার্ন List<string>
শুধু জরিমানা, যেহেতু অভিধান রাষ্ট্রীয় শুধুমাত্র encapsulates হয় পরিচয় বরং তাদের বিষয়বস্তু চেয়ে তালিকা তাহাতে এর।
List<T>
কারণ এটি এখন সম্পূর্ণ খুব বহুমুখী (যেমন কুশলী পদ্ধতি প্রচুর সঙ্গে, একটি খুব সাধারণভাবে দেখা ধারক Sort
, Find
কিন্তু (উদাহরণস্বরূপ সন্নিবেশ উপর চেক আইটেম,) আপনি আচরণের কোনো ওভাররাইড করতে চান কোন এক্সটেনশন পয়েন্ট আছে -, ইত্যাদি)।
Collection<T>
যে কোনও IList<T>
(একটি ডিফল্ট List<T>
) এর চারপাশে একটি মোড়ক - এটিতে এক্সটেনশন পয়েন্ট ( virtual
পদ্ধতি) রয়েছে, তবে অনেকগুলি সমর্থন পদ্ধতি যেমন পছন্দ করে না Find
। ইন্ডিরিয়েশনের কারণে এটি তুলনায় কিছুটা ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কম হয় List<T>
না।
LINQ সঙ্গে, অতিরিক্ত পদ্ধতিতে List<T>
কম গুরুত্বপূর্ণ হয়ে, যেহেতু LINQ টু অবজেক্টস যাহাই হউক না কেন তাদের প্রদান থাকে ... উদাহরণস্বরূপ First(pred)
, OrderBy(...)
ইত্যাদি
তালিকা দ্রুত।
উদাহরণস্বরূপ করুন
private void button1_Click(object sender, EventArgs e)
{
Collection<long> c = new Collection<long>();
Stopwatch s = new Stopwatch();
s.Start();
for (long i = 0; i <= 10000000; i++)
{
c.Add(i);
}
s.Stop();
MessageBox.Show("collect " + s.ElapsedMilliseconds.ToString());
List<long> l = new List<long>();
Stopwatch s2 = new Stopwatch();
s2.Start();
for (long i = 0; i <= 10000000; i++)
{
l.Add(i);
}
s2.Stop();
MessageBox.Show("lis " + s2.ElapsedMilliseconds.ToString());
}
আমার মেশিনে List<>
প্রায় দ্বিগুণ দ্রুত।
সম্পাদনা করুন
আমি বুঝতে পারি না কেন লোকেরা এটিকে নিম্নচাপ দিচ্ছে। আমার ওয়ার্ক মেশিন এবং আমার হোম মেশিনে উভয়ই তালিকা <> কোডটি 80% দ্রুত।
তালিকা এমন একটি সংকলন উপস্থাপন করে যেখানে আইটেমগুলির ক্রম গুরুত্বপূর্ণ। এটি বাছাই এবং অনুসন্ধান পদ্ধতিগুলি সমর্থন করে। সংগ্রহটি একটি আরও সাধারণ ডেটা-কাঠামো যা ডেটা সম্পর্কে কম অনুমান করে এবং এটিকে কাজে লাগানোর জন্য কম পদ্ধতির সমর্থন করে। আপনি যদি কোনও কাস্টম ডেটা কাঠামো প্রকাশ করতে চান তবে আপনার সম্ভবত সংগ্রহটি প্রসারিত করা উচিত। আপনার যদি ডেটা-ডাব্লু / ও ডাটা-স্ট্রাকচারটি প্রকাশ করে ডেটা ম্যানিপুলেট করতে হয় তবে একটি তালিকা সম্ভবত আরও বেশি সুবিধাজনক উপায়।
এটি সেই গ্রেড স্কুলের প্রশ্নগুলির মধ্যে একটি। টি এর সংগ্রহটি এক প্রকার বিমূর্ত; একটি ডিফল্ট বাস্তবায়ন হতে পারে (আমি কোনও। নেট / সি # লোক নই) তবে সংগ্রহে অ্যাড, রিমুভ, পুনরাবৃত্তি ইত্যাদির মতো প্রাথমিক ক্রিয়াকলাপ থাকবে।
টি-এর তালিকাটি এই ক্রিয়াকলাপগুলির সম্পর্কে কিছু সুনির্দিষ্ট বোঝায়: যুক্ত হওয়াতে ধ্রুব সময় নেওয়া উচিত, সরানো উচিত উপাদানগুলির সংখ্যার সাথে সমানুপাতিক সময় নেওয়া উচিত, গেটফার্স্ট কনসেন্ট সময় হওয়া উচিত। সাধারণভাবে, একটি তালিকা এক ধরণের সংগ্রহ, তবে সংগ্রহটি এক প্রকারের তালিকা নয়।
হ্যানসেলম্যান স্পিকার : " Collection<T>
তালিকার মতো দেখতে এটির List<T>
অভ্যন্তরীণভাবেও রয়েছে EV প্রতিটি একক পদ্ধতি অভ্যন্তরীণভাবে প্রতিনিধিত্ব করে List<T>
It এটির মধ্যে একটি সুরক্ষিত সম্পত্তি রয়েছে যা প্রকাশ করে List<T>
।"
সম্পাদনা: Collection<T>
সিস্টেমের মধ্যে নেই en জেনেরিক.কলেকশনস। নেট 3.5। আপনি .NET 2.0 থেকে 3.5 এ স্থানান্তরিত হয়ে যদি আপনি প্রচুর Collection<T>
অবজেক্ট ব্যবহার করেন তবে আপনাকে কিছু কোড পরিবর্তন করতে হবে , যদি না আমি স্পষ্ট কিছু মিস করছি ...
সম্পাদনা 2: Collection<T>
এখন সিস্টেমে রয়েছে Col সংগ্রহগুলি.অবজেক্টমোডেল নেট স্পেস .NET 3.5 এ। সহায়তা ফাইলটি এটি বলে:
"সিস্টেম.কালেকশনস.অজেক্টমোডেল নেমস্পেসে এমন ক্লাস রয়েছে যা একটি পুনরায় ব্যবহারযোগ্য লাইব্রেরির অবজেক্ট মডেলে সংগ্রহ হিসাবে ব্যবহার করা যেতে পারে properties
এই সমস্ত ইন্টারফেসের উত্তরাধিকার সূত্রে প্রাপ্ত IEnumerable
, যা আপনার নিশ্চিত হওয়া উচিত understand এই ইন্টারফেসটি মূলত আপনাকে পূর্ববর্তী বিবৃতিতে ক্লাসটি ব্যবহার করতে দেয় (সি # তে)।
ICollection
আপনার তালিকাভুক্ত ইন্টারফেসগুলির মধ্যে সবচেয়ে বেসিক। এটি একটি প্রচুর পরিমাণে ইন্টারফেস যা এটি সমর্থন করে Count
এবং এটি প্রায়।IList
এটি হ'ল সমস্ত ICollection
কিছু, তবে এটি আইটেম যুক্ত এবং অপসারণকে সমর্থন করে, সূচক অনুসারে আইটেমগুলি পুনরুদ্ধার করা ইত্যাদি It's এটি "অবজেক্টের তালিকার" জন্য সর্বাধিক ব্যবহৃত ইন্টারফেস, যা আমি জানি অস্পষ্ট।IQueryable
লিনকু সমর্থন করে এমন একটি গণনাযোগ্য ইন্টারফেস। আপনি সর্বদা IQueryable
একটি আইলিস্ট থেকে একটি তৈরি করতে পারেন এবং অবজেক্টগুলিতে লিনকিউ ব্যবহার করতে পারেন, তবে আপনি IQueryable
লিনকুতে এসকিউএল এবং এসকিউএল থেকে লিনকুতে সত্তা থেকে এসকিউএল স্টেটমেন্টগুলির স্থগিত সম্পাদনের জন্যও ব্যবহার করতে পারেন ।IDictionary
অর্থে এটি একটি পৃথক প্রাণী যে এটি মূল্যবোধের অনন্য কীগুলির ম্যাপিং। আপনি কী / মান জোড়গুলি গণনা করতে পারবেন এটিও অপরিমেয় তবে অন্যথায় এটি আপনি তালিকাভুক্ত অন্যদের চেয়ে আলাদা উদ্দেশ্যে কাজ করেদুটিই MSDN, তালিকা (t -এর) অনুযায়ী .Add "একটি হে (ঢ) অপারেশন" (যখন "ক্যাপাসিটি" ছাড়িয়ে করা হয়) থাকে তখন এটি সংগ্রহ (এর টি) .Add হয় সবসময় "একটি হে (1) অপারেশন"। এটি অ্যারে এবং লিঙ্কযুক্ত তালিকা সংগ্রহের মাধ্যমে তালিকাটি প্রয়োগ করা হলে তা বোধগম্য হবে। যাইহোক, যদি এটি হয়ে থাকে তবে কেউ সংগ্রহ (অফ টি) সংগ্রহের প্রত্যাশা করতে পারে tem এটি "একটি ও (এন) অপারেশন" হবে। কিন্তু - এটি - না !?! সংগ্রহ (টি অফ)। আইটেমটি হ'ল তালিকার (টি) এর মতো "একটি ও (1) অপারেশন" tem আইটেম।
তার উপরে, "টিউনস্টোয়েল" এর "29 ডিসেম্বর '08 তে 22:31" উপরে দাবি করা গতি পরীক্ষার তালিকাগুলি তালিকা দেখায় (টি)। দীর্ঘ এবং স্ট্রিংস। যদিও আমি কেবলমাত্র তার দাবী 80% এর তুলনায় আমি মাত্র ~ 33% দ্রুত পেয়েছি, এমএসডিএন অনুসারে, এর বিপরীত ও "এন" বার হওয়া উচিত!!
উভয়ই একই ইন্টারফেস প্রয়োগ করে, তাই তারা একইভাবে আচরণ করবে। সম্ভবত এগুলি অভ্যন্তরীণভাবে আলাদাভাবে প্রয়োগ করা হয়েছে তবে এটি পরীক্ষা করতে হবে।
আমি দেখতে পাই কেবলমাত্র আসল পার্থক্য Collection<T>
হ'ল নেমস্পেস এবং সত্য যেটি চিহ্নিত করা হয়েছে ComVisibleAttribute(false)
, তাই COM কোড এটি ব্যবহার করতে পারে না।
অন্যান্য asnwers ছাড়াও, আমি জেনেরিক তালিকা এবং সংগ্রহের ক্ষমতাগুলির দ্রুত ওভারভিউ সংকলন করেছি। সংগ্রহ তালিকার সীমিত উপসেট:
* = উপস্থিত
o = আংশিকভাবে উপস্থিত
সম্পত্তি / পদ্ধতি সংগ্রহ <টি> তালিকা <টি>
----------------------------------------------
Add() * *
AddRange() *
AsReadOnly() *
BinarySearch() *
Capacity *
Clear() * *
Contains() * *
ConvertAll() *
CopyTo() o *
Count * *
Equals() * *
Exists() *
Find() *
FindAll() *
FindIndex() *
FindLast() *
FindLastIndex() *
ForEach() *
GetEnumerator() * *
GetHashCode() * *
GetRange() *
GetType() * *
IndexOf() o *
Insert() * *
InsertRange() *
Item() * *
LastIndexOf() *
New() o *
ReferenceEquals() * *
Remove() * *
RemoveAll() *
RemoveAt() * *
RemoveRange() *
Reverse() *
Sort() *
ToArray() *
ToString() * *
TrimExcess() *
TrueForAll() *