'আইলিস্ট' বনাম 'আইকোলিকেশন' বনাম 'সংগ্রহ' ফেরত আসছে


119

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

সংগ্রহগুলি আমি মনে আছে যে IList, ICollectionএবং Collection

এই ধরণের একটিটি ফেরত দেওয়া কি সর্বদা অন্যের চেয়ে পছন্দ হয়, বা এটি নির্দিষ্ট পরিস্থিতির উপর নির্ভর করে?



উত্তর:


71

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

IEnumerable<T>রিটার্ন টাইপ হিসাবে ইন্টারফেস বিবেচনা করুন । যদি ফলাফলটি কেবল পুনরাবৃত্তি হতে চলেছে তবে ভোক্তাকে এর চেয়ে বেশি প্রয়োজন হয় না।


25
তবে আইকোলিকেশন <T> কেও বিবেচনা করুন যা একটি গণনা সম্পত্তি সহ অতিরিক্ত ইউটিলিটিগুলি সরবরাহ করতে আইওনামেবল <T> প্রসারিত করে। এটি সহায়ক হতে পারে কারণ আপনি সিক্যুয়েন্সের দৈর্ঘ্যটি একাধিক বার অতিক্রম না করেই নির্ধারণ করতে পারেন।
retrodrone

11
@retrodrone: বাস্তবিক বাস্তবায়ন Countপদ্ধতি চেক সংগ্রহ প্রকৃত টাইপ, তাই এটি ব্যবহার করা হবে Lengthবা Countঅ্যারে মত কিছু পরিচিত ধরনের জন্য বৈশিষ্ট্য এবং ICollectionএমনকি যখন আপনি একটি যেমন সরবরাহ IEnumerable
গুফা

8
@ গুফা: এটি লক্ষণীয় উপযুক্ত হতে পারে যে কোনও শ্রেণি যদি Thing<T>প্রয়োগ করে IList<T>তবে অ-জেনেরিক না হয় ICollection, তবে IEnumerable<Cat>.Count()একটি কল Thing<Cat>করা দ্রুত হবে, তবে কলিং IEnumerable<Animal>.Count()ধীর হবে (যেহেতু এক্সটেনশন পদ্ধতিটি কার্যকর করে এবং এটি খুঁজে পায় না) ICollection<Cat>)। যদি শ্রেণিটি অ-জেনেরিক প্রয়োগ করে ICollectionতবে IEnumerable<Animal>.Countএটি খুঁজে পেতে এবং এটি ব্যবহার করতে পারে।
সুপারক্যাট


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

140

ICollection<T>একটি ইন্টারফেস যে যেমন সংগ্রহে শব্দার্থবিদ্যা অনাবৃত হল Add(), Remove()এবং Count

Collection<T>ICollection<T>ইন্টারফেসের একটি কংক্রিট বাস্তবায়ন ।

IList<T>মূলত ICollection<T>এলোমেলো অর্ডার-ভিত্তিক অ্যাক্সেস সহ একটি ।

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


5
Collection<T>প্রয়োগ IList<T>এবং না শুধুমাত্র ICollection<T>
কোডসইনচায়োস

56
নেট মধ্যে সমস্ত সংগ্রহ আদেশ করা হয়, কারণ IEnumerable<T>আদেশ করা হয়। যা IList<T>থেকে আলাদা হয় ICollection<T>তা হ'ল এটি সদস্যদেরকে সূচকগুলি সহ কাজ করার প্রস্তাব দেয়। উদাহরণস্বরূপ list[5]কাজ করে তবে collection[5]সংকলন করবে না।
সুইভ 21

5
আদেশের সংগ্রহগুলি কার্যকর করা উচিত বলেও আমি একমত নই IList<T>। প্রচুর অর্ডার করা সংগ্রহ রয়েছে যা তা করে না। IList<T>দ্রুত সূচক অ্যাক্সেস সম্পর্কে।
কোডসইনচায়োস

4
@ ইয়য়ো। নেট সংগ্রহের ক্লাস এবং ইন্টারফেসগুলি কেবল খারাপভাবে ডিজাইন করা হয়েছে এবং খারাপ নাম দেওয়া হয়েছে। কেন তারা তাদের নামটি দিয়েছিল তা নিয়ে আমি খুব বেশি চিন্তা করব না।
কোডসইনচওস

6
@ এসভিক: অর্ডার করার কারণে সমস্ত সংগ্রহের আদেশ IEnumerable<T>দেওয়া হয়েছে? নিন HashSet<T>- এটি প্রয়োগ করে IEnumerable<T>তবে পরিষ্কারভাবে আদেশ করা হয়নি। অর্থাৎ আইটেমগুলির ক্রমটিতে আপনার কোনও প্রভাব নেই এবং যদি অভ্যন্তরীণ হ্যাশ টেবিলটি পুনরায় সাজানো থাকে তবে এই আদেশটি যে কোনও সময় পরিবর্তন হতে পারে change
অলিভিয়ার জ্যাকট-ডেসকোম্বেস 17

61

মধ্যে মূল পার্থক্য IList<T>এবং ICollection<T>যে IList<T>একটি সূচক মাধ্যমে এক্সেস উপাদান আপনি করতে পারবেন। IList<T>অ্যারের মতো ধরণের বর্ণনা দেয়। একটিতে উপাদানগুলি ICollection<T>কেবল গণনার মাধ্যমে অ্যাক্সেস করা যায়। উভয়ই উপাদান সন্নিবেশ এবং মোছার অনুমতি দেয়।

আপনার যদি কেবল একটি সংগ্রহের সংখ্যা প্রয়োজন হয় তবে IEnumerable<T>তা পছন্দ করা উচিত। অন্যের তুলনায় এর দুটি সুবিধা রয়েছে:

  1. এটি সংগ্রহের পরিবর্তনগুলি অস্বীকার করে (তবে উপাদানগুলির মধ্যে তারা রেফারেন্স ধরণের হয় না তবে)।

  2. এটি অ্যালগোরিদমিকভাবে উত্পন্ন এবং আদৌ সংগ্রহ নয় এমন গণনা সহ সর্বাধিক সম্ভাব্য বিভিন্ন উত্সের অনুমতি দেয়।

Collection<T>একটি বেস ক্লাস যা সংগ্রহের প্রয়োগকারীদের জন্য মূলত কার্যকর। আপনি যদি এটি ইন্টারফেসে (এপিআই) প্রকাশ করেন তবে এগুলি থেকে প্রাপ্ত নয় এমন অনেক দরকারী সংগ্রহ বাদ দেওয়া হবে।


এর একটি অসুবিধা IList<T>হ'ল অ্যারে এটি বাস্তবায়ন করে তবে আপনাকে আইটেমগুলি যুক্ত বা সরাতে দেয় না (যেমন আপনি অ্যারের দৈর্ঘ্য পরিবর্তন করতে পারবেন না)। আপনি যদি IList<T>.Add(item)অ্যারেতে কল করেন তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে । IList<T>বুলিয়ান সম্পত্তি রয়েছে বলে পরিস্থিতি কিছুটা হ্রাস পেয়েছে IsReadOnlyযা করার চেষ্টা করার আগে আপনি যাচাই করতে পারেন। তবে আমার দৃষ্টিতে এটি এখনও গ্রন্থাগারের নকশার ত্রুটি । অতএব, আমি List<T>সরাসরি ব্যবহার করি , যখন আইটেমগুলি যুক্ত করতে বা সরানোর সম্ভাবনা প্রয়োজন হয়।


কোড বিশ্লেষণ (এবং FxCop) উপদেশ যে যখন একটি কংক্রিট জেনেরিক সংগ্রহ ফেরার নিম্নলিখিত এক ফেরত পাঠানো হবে: Collection, ReadOnlyCollectionবা KeyedCollection। এবং এটি Listফেরত দেওয়া উচিত নয়।
ডেভিডআর

@ ডেভিডআরআর: প্রায়শই আইটেমগুলি যুক্ত করতে বা সরিয়ে ফেলতে হয় এমন কোনও পদ্ধতির একটি তালিকা পাস করা কার্যকর। আপনি যদি প্যারামিটারটি টাইপ করেন তবে প্যারামিটার হিসাবে IList<T>কোনও অ্যারে দিয়ে পদ্ধতিটি কল করা হবে না তা নিশ্চিত করার কোনও উপায় নেই।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

7

IList<T>সমস্ত জেনেরিক তালিকার জন্য বেস ইন্টারফেস। যেহেতু এটি একটি আদেশযুক্ত সংগ্রহ, তাই বাস্তবায়ন আদেশ অনুসারে বাছাই করা ক্রম থেকে সন্নিবেশ ক্রমানুসারে সিদ্ধান্ত নিতে পারে। তদুপরি Ilistআইটেম সম্পত্তি রয়েছে যা পদ্ধতিগুলি তাদের সূচকগুলির উপর নির্ভর করে তালিকায় এন্ট্রিগুলি পড়তে এবং সম্পাদনা করতে সক্ষম করে। এটি অবস্থান সূচিতে তালিকাতে / থেকে কোনও মান সন্নিবেশ করা, সরিয়ে ফেলা সম্ভব করে possible

এছাড়াও, থেকে IList<T> : ICollection<T>সমস্ত পদ্ধতি ICollection<T>বাস্তবায়নের জন্য এখানেও উপলভ্য are

ICollection<T>সমস্ত জেনেরিক সংগ্রহের জন্য বেস ইন্টারফেস। এটি আকার, গণক এবং সিঙ্ক্রোনাইজেশন পদ্ধতি সংজ্ঞায়িত করে। আপনি সংগ্রহে কোনও আইটেম যুক্ত করতে বা মুছতে পারেন তবে সূচী সম্পত্তি না থাকার কারণে কোন অবস্থানে এটি ঘটে তা আপনি চয়ন করতে পারবেন না।

Collection<T>জন্য একটি বাস্তবায়ন উপলব্ধ IList<T>, IListএবং IReadOnlyList<T>

আপনি যদি এর ICollection<T>পরিবর্তে সংকীর্ণ ইন্টারফেস টাইপ ব্যবহার করেন তবে আপনি আপনার কোডটিকে IList<T>ব্রেকিং পরিবর্তনের বিরুদ্ধে রক্ষা করুন। আপনি যদি বৃহত্তর ইন্টারফেসের মতো ব্যবহার করেন তবে IList<T>কোড পরিবর্তনগুলি ভেঙে যাওয়ার আশঙ্কা আপনার বেশি।

একটি উত্স থেকে উদ্ধৃতি ,

ICollection, ICollection<T>: আপনি সংগ্রহটি পরিবর্তন করতে চান বা আপনি এটির আকার সম্পর্কে যত্নশীল। IList, IList<T>: আপনি সংগ্রহটি পরিবর্তন করতে চান এবং আপনি সংগ্রহের উপাদানগুলির ক্রম এবং / বা অবস্থানের বিষয়ে যত্নশীল care


5

ইন্টারফেসের ধরণটি ফেরত দেওয়া আরও সাধারণ, সুতরাং (আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে আরও তথ্যের অভাব রয়েছে) আমি সেদিকে ঝুঁকছি। আপনি যদি ইনডেক্সিং সমর্থনটি প্রকাশ করতে চান তবে চয়ন করুন IList<T>, অন্যথায় ICollection<T>যথেষ্ট হবে। অবশেষে, আপনি যদি নির্দেশিত করতে চান যে প্রত্যাবর্তিত প্রকারগুলি কেবলমাত্র পঠিত হয়েছে, চয়ন করুন IEnumerable<T>

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


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

-3

কিছু প্রশ্ন রয়েছে যা এই প্রশ্ন থেকে আসে:

  • ইন্টারফেস বনাম ক্লাস
  • বিভিন্ন নির্দিষ্ট ক্লাস, সংগ্রহ, তালিকা, অ্যারে থেকে কোন নির্দিষ্ট শ্রেণি?
  • সাধারণ ক্লাস বনাম সাবাইটেম ("জেনেরিক্স") সংগ্রহ

আপনি হাইলাইট করতে চাইতে পারেন এটির একটি অবজেক্ট অরিয়েন্টেড এপিআই

ইন্টারফেস বনাম ক্লাস

ইন্টারফেসগুলির সাথে আপনার যদি খুব বেশি অভিজ্ঞতা না হয় তবে আমি ক্লাসে আটকে থাকার পরামর্শ দিই। আমি অনেক সময় বিকাশকারীদের ইন্টারফেসে ঝাঁপিয়ে পড়ে দেখি, এমনকি যদি এটি নেসারিলি না হয়।

এবং এর পরিবর্তে, একটি ভাল শ্রেণিবদ্ধ ডিজাইন, যা শেষ পর্যন্ত, একটি ভাল ইন্টারফেস ডিজাইনে স্থানান্তরিত করা যায় ...

আপনি এপিআইতে প্রচুর ইন্টারফেস দেখতে পাবেন, তবে, আপনার যদি এটির প্রয়োজন না হয় তবে তাড়াহুড়া করবেন না।

আপনি শেষ পর্যন্ত আপনার কোডে ইন্টারফেস প্রয়োগ করতে শিখবেন।

বিভিন্ন নির্দিষ্ট ক্লাস, সংগ্রহ, তালিকা, অ্যারে থেকে কোন নির্দিষ্ট শ্রেণি?

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

আপনার ক্লাসটি বাছাই করা যেতে পারে বা উপাদানগুলিতে কিছু ফর্ম্যাট প্রয়োগ করতে পারে তা আপনার এআইপি ব্যবহারকারীকে কী সত্যিই জানতে হবে? তারপরে "CanBeSortClass" বা "ElementsCanBePaintedClass" ব্যবহার করুন, অন্যথায় "GenericBrandClass" ব্যবহার করুন।

অন্যথায়, আরও সাধারণ ক্লাস ব্যবহার করুন।

সাবাইটেম ("জেনেরিকস") সংগ্রহের তুলনায় সাধারণ সংগ্রহের ক্লাস

আপনি দেখতে পাবেন যে এখানে এমন শ্রেণি রয়েছে যেখানে অন্যদের উপাদান রয়েছে এবং আপনি নির্দিষ্ট করতে পারেন যে সমস্ত উপাদান নির্দিষ্ট ধরণের হওয়া উচিত।

জেনেরিক সংগ্রহগুলি হ'ল সেই ক্লাসগুলি যা আপনি একই সংকলনটি ব্যবহার করতে পারেন, বেশ কয়েকটি কোড অ্যাপ্লিকেশনের জন্য, একটি নতুন সংগ্রহ তৈরি না করেই, প্রতিটি নতুন সাবাইটেম ধরণের জন্য: সংগ্রহ

আপনার এপিআই ব্যবহারকারীর কি সমস্ত উপাদানগুলির জন্য একই, খুব নির্দিষ্ট ধরণের প্রয়োজন হবে?

এর মতো কিছু ব্যবহার করুন List<WashingtonApple>

আপনার এপিআই ব্যবহারকারীর কি বেশ কয়েকটি সম্পর্কিত ধরণের প্রয়োজন হবে?

প্রকাশ List<Fruit>আপনার API- এর জন্য, এবং ব্যবহার List<Orange> List<Banana>, List<Strawberry>অভ্যন্তরীণভাবে, যেখানে Orange, Bananaএবং Strawberryথেকে উত্তরপুরুষ Fruit

আপনার এপিআই ব্যবহারকারীর কি জেনেরিক ধরণের সংগ্রহের দরকার আছে?

Listসমস্ত আইটেম object(গুলি) যেখানে ব্যবহার করুন ।

চিয়ার্স।


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

@ অ্যাটকনওয়ে আমি নিয়মিত ইন্টারফেস ব্যবহার করি তবে অনেকগুলি ধারণা এটির একটি শক্তিশালী হাতিয়ার হিসাবে এটি মিক্স-ব্যবহার করা সহজ হতে পারে। এবং, কখনও কখনও, বিকাশকারী এটি প্রয়োজন হতে পারে না। আমার পরামর্শটি "কখনও ইন্টারফেস করবেন না" ছিল না, আমার পরামর্শ ছিল "এই ক্ষেত্রে আপনি ইন্টারফেসগুলি এড়িয়ে যেতে পারেন it এটি সম্পর্কে শিখুন, এবং পরে সেগুলির সেরাটি পেতে পারেন"। চিয়ার্স।
umlcat

1
আমি সবসময় ইন্টারফেসে প্রোগ্রামিং করার পরামর্শ দিই। এটি কোডটি আলগাভাবে সংযুক্ত রাখতে সহায়তা করে।
mac10688

@ mac10688 আমার পূর্ববর্তী উত্তর (এটকনওয়ে) আপনার মন্তব্যেও প্রযোজ্য।
umlcat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.