সি # তে বিভিন্ন সংগ্রহের জেনেরিক ইন্টারফেসের মধ্যে পার্থক্য


11

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

মধ্যে মৌলিক পার্থক্য কি IEnumerable<T>, ICollection<T>, List<T>(Class)?

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


2
IList <T> পাশাপাশি রয়েছে
জে কে।

উত্তর:


19

তালিকা <টি> একটি শ্রেণি এবং আইকোলিকেশন <টি> এবং আইনিউমেন্টেবল <T> ইন্টারফেস উভয়ই প্রয়োগ করে । এছাড়াও, আইকোলিকেশন <T> IEnumerable <T> ইন্টারফেস প্রসারিত করে। এগুলি বিনিময়যোগ্য নয়, অন্তত সমস্ত দৃষ্টিকোণ থেকে নয়।

আপনার যদি একটি তালিকা <টি> থাকে তবে আপনাকে গ্যারান্টি দেওয়া হয় যে এই অবজেক্টটি আইকোলিকেশন <T> এবং আইনিউমেবল <T> ইন্টারফেসের দ্বারা প্রয়োগ করার জন্য প্রয়োজনীয় পদ্ধতি এবং বৈশিষ্ট্যগুলি প্রয়োগ করে। সংকলক এটি জানে এবং আপনাকে এগুলিকে একটি আইকোলিকেশন <T> বা একটি অনুমেয় <t> অন্তর্নিহিতভাবে "ডাউন" করার অনুমতি দেয় to তবে, যদি আপনার কোনও আইকোলিকেশন থাকে <T> আপনার কোডটিতে আগে itালার আগে আপনার কোডটি প্রথমে আপনার তালিকাতে পরীক্ষা করতে হবে এটি তালিকা <T> বা অন্য কিছু, সম্ভবত একটি অভিধান <T> (যেখানে টি একটি কীভ্যালিউপায়ার রয়েছে ) তা cast ইচ্ছা.

আপনি জানেন যে আইকোলিকেশনটি আইমনামেবলকে প্রসারিত করে, তাই আপনি এটিকে একটি IEnumerable এ ফেলে দিতে পারেন। তবে আপনার যদি কেবল একটি অনুমিত হয় তবে আবার আপনার গ্যারান্টি নেই যে এটি একটি তালিকা। এটি হতে পারে তবে এটি অন্যরকম কিছু হতে পারে। উদাহরণস্বরূপ আপনি যদি কোনও অভিধান <টি> অভিধানে একটি তালিকা কাস্ট করার চেষ্টা করেন তবে আপনার একটি অবৈধ কাস্ট ব্যতিক্রম আশা করা উচিত।

সুতরাং তারা "বিনিময়যোগ্য" নয়।

এছাড়াও, প্রচুর জেনেরিক ইন্টারফেস রয়েছে, আপনি সিস্টেম.কলেশনগুলি.জেনেরিক নেমস্পেসে কী পেতে পারেন তা পরীক্ষা করে দেখুন ।

সম্পাদনা করুন: আপনার মন্তব্য সম্পর্কিত, আপনি যদি তালিকা <T> বা এটি প্রয়োগ করে এমন একটি ইন্টারফেস ব্যবহার করেন তবে একেবারে পারফরম্যান্সের জরিমানা নেই। আপনার এখনও একটি নতুন অবজেক্ট তৈরি করতে হবে, নিম্নলিখিত কোডটি দেখুন:

List<T> list = new List<T>();
ICollection<T> myColl = list;
IEnumerable<T> myEnum = list;

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

ICollection<T> myColl = new List<T>();

মাইকোল , রানটাইমে এখনও একটি তালিকা।

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

কল্পনা করুন যে "পারফরমফেরেশন" পদ্ধতির প্রয়োজন কেবলমাত্র উপাদানগুলির গণনা করা, কিছু কাজ করা এবং প্রস্থান করা, সেক্ষেত্রে আপনাকে তালিকা <T> এ উপলব্ধ আরও কয়েক শতাধিক পদ্ধতির প্রয়োজন নেই, আপনাকে কেবলমাত্র আইনিউমেন্টেবল <টিতে উপলভ্য যেগুলি প্রয়োজন >, সুতরাং নিম্নলিখিতগুলি প্রয়োগ করা উচিত:

public void PerformOperation(IEnumerable<T> myEnumeration) { ... }

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

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


সবার আগে ধন্যবাদ। এখন, উদ্বেগের বিষয়টি কী কী ব্যবহার করবেন তা সিদ্ধান্ত নেবেন কীভাবে ??। যেহেতু তালিকা <T> উভয় ইন্টারফেস প্রয়োগ করে, কেন সবসময়ই এটি প্রতিস্থাপনযোগ্য বা আইকোলিকেশন প্রয়োজনীয় যেখানেই তা ব্যবহার করবেন না। সর্বদা তালিকা ব্যবহারের পারফরম্যান্সের প্রভাব পড়বে? এই উদ্বেগগুলির জবাব দেওয়ার জন্য দয়া করে আপনার উত্তরটি সম্পাদনা করুন
পঙ্কজ উপাধ্যায়

আমি আপনার সম্পাদনা প্রশ্নের উত্তর দিতে সম্পাদনা করেছি
জালান

+1, তবে আমি যুক্ত করব যে বিরল ক্ষেত্রে যেখানে আপনাকে আসলে কোনও পদ্ধতিতে একটি তালিকা পাস করার দরকার হয়, আপনি পদ্ধতি ঘোষণার IListপরিবর্তে ব্যবহার করা উচিত List
কোনামিমন

@ কোনামিমন - নির্ভর করে যদি আপনার List<>নির্দিষ্ট কার্যকারিতা প্রয়োজন হয় তবে .AddRange()IList<>যে করাবে না।
ববসন

6

আইকোলিকেশন এবং আইএনউমারেবলের জন্য এমএসডিএন পৃষ্ঠাগুলি একবার দেখুন ।

খুব বিমূর্ত শব্দে, আমি এই ধরণের সম্পর্কে এইভাবেই ধারণা রাখি।

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

একটি আইকোলিকেশন একটি আইইনুমেবলের চেয়ে কংক্রিট। একটি মূল পার্থক্য হ'ল একটি সংগ্রহে কতটি আইটেম রয়েছে তা জানে; আপনি কতগুলি আইটেম একটি গুণতে পারেন তা কার্যকরভাবে কার্যকরভাবে লুপ করে সেগুলি গণনা করুন:

আমি: ছেলেরা, আপনার প্রতিটিতে কতটি আইটেম রয়েছে?

গণনাযোগ্য: আমি আসলে জানি না। ভাল, এখানে একটি আইটেম। আমি অন্য একটি পেয়েছি, তাই দুটি। এবং অন্য একটি, সুতরাং এটি তিনটি ... এবং অপরটি একটি ... ঠিক আছে এটি ২৩৮২ টি। আর কোনও আইটেম নেই, তাই আমার কাছে ২৩৮২ আছে। আমাকে আবার জিজ্ঞাসা করবেন না কারণ আমাকে আবারও তাদের সবগুলি দিয়ে যেতে হবে।

সংগ্রহ: আমি 2382 টি আইটেম পেয়েছি। আমি এটা ইতিমধ্যে জানি।

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

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

অন্যান্য ধরণের সংগ্রহের মধ্যে রয়েছে Queueএবং Stackপাশাপাশি Dictionary

এই ধরণের নামগুলি বেশ কার্যকর - আপনি একটি সারি এবং একটি স্ট্যাককে তাদের আসল বিশ্ব সহযোগী হিসাবে কল্পনা করতে পারেন এবং আপনার তালিকার যে পার্থক্য থাকতে পারে তা বিবেচনা করতে পারেন।


"আমি সংগ্রহ এবং একটি তালিকার মধ্যে ব্যবহারিক পার্থক্য সম্পর্কে চিন্তা করতে সংগ্রাম করছি" ... পরে আপনার উত্তরে আপনি নিজেই এই উত্তর দিন। একটি Listএকটি হল ICollection, কিন্তু একটি ICollectionসব সময়ই নয় List( Queue, Stack, Dictionary, ...)
স্টিভেন Jeuris

@ স্টিভেন এটি খুব দুরন্ত উত্তর। আমি একমত যে এটি একটি গুরুত্বপূর্ণ পার্থক্য, তবে আমি এটিকে ব্যবহারিক পার্থক্য বলব না। এটি ব্যবহারকারীর অর্থ কী?
কर्क ব্রডহર્স্ট

এটা সহজ! :) Queue<int> queue = (Queue<int>)list;একটি নিক্ষেপ করা হবে InvalidCastExceptionযখন listএকটি Queue<int>। সারি এবং তালিকার মধ্যে পার্থক্য এই প্রশ্নের সুযোগের বাইরে।
স্টিভেন জিউরিস

আইউনামেবলের সমালোচনামূলক দিকটি কি এটি বর্তমান এবং পরবর্তী আইটেমগুলি ফিরিয়ে আনতে পারে না - আপনি সেটিকে সাজিয়ে তোলেন , তবে স্পষ্টভাবে এটি বলে না। মূলত এমন কিছু যা একা আইনুনামেবল প্রয়োগ করে তার সদস্যদের স্বেচ্ছাসেবী আইটেমটি জিজ্ঞাসাবাদে ফিরিয়ে দিতে পারে না - কেবলমাত্র বর্তমান এবং পরবর্তী একটি।
কোরি

@ কোরি এটি একেবারে সংযুক্ত করার উপায়, আমার উত্তরের চেয়ে অনেক পরিষ্কার।
কर्क ব্রডহર્স্ট

-1

IQueryable:

আইটেমগুলিতে সত্যিকারভাবে পুনরাবৃত্তি না হওয়া অবধি কোয়েরি কার্যকর করা হয় না, সম্ভবত .ToList () করে

IEnumerable:

কেবলমাত্র আইটেমের ফরোয়ার্ড তালিকা। আইটেম 0-3 পাস না করে আপনি "আইটেম 4" এ পেতে পারবেন না। কেবলমাত্র পঠন তালিকা, আপনি এটিতে যুক্ত করতে বা এটি থেকে সরাতে পারবেন না। তবুও স্থগিত কার্যকর হতে পারে।

আমি তালিকা:

সম্পূর্ণ তালিকায় এলোমেলো অ্যাক্সেস সম্পূর্ণরূপে মেমরির যোগ এবং অপসারণ সমর্থন করে

ICollection:

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


এই উত্তরটি কিছু উপর মূল্যবান যোগ করার জন্য মনে হয় না কি ইতিমধ্যে তার আগে উত্তর পোস্ট করা হয়ছে
মশা

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