কেন বহুবিধ / এক / বহু সম্পর্কের উপরে আইকোলিকেশন ব্যবহার করুন এবং আইইনিউমারেবল বা তালিকার <T> নয়?


359

আমি এটিকে নেভিগেশন বৈশিষ্ট্য সহ টিউটোরিয়ালগুলিতে অনেক দেখছি ICollection<T>

সত্তা ফ্রেমওয়ার্কের জন্য এটি কি বাধ্যতামূলক প্রয়োজনীয়তা? আমি কি ব্যবহার করতে পারি IEnumerable?

এর ICollectionপরিবর্তে IEnumerableবা এমনকি ব্যবহারের মূল উদ্দেশ্য কী List<T>?

উত্তর:


439

সাধারণত আপনি যা চয়ন করেন তা নির্ভর করে কোন পদ্ধতিতে আপনার অ্যাক্সেস প্রয়োজন on সাধারণভাবে - IEnumerable<>(এমএসডিএন: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx ) কেবলমাত্র পুনরাবৃত্তি করা আবশ্যক অবজেক্টগুলির একটি তালিকার জন্য, ICollection<>(এমএসডিএন: http: // msdn.mic Microsoft.com/en-us/library/92t2ye13.aspx ) যে উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করা এবং সংশোধন করা দরকার, List<>সেই বস্তুর তালিকার জন্য যা পুনরুক্ত, সংশোধন, বাছাই করা ইত্যাদির জন্য প্রয়োজন (এখানে দেখুন দেখুন) সম্পূর্ণ তালিকার জন্য: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx )।

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

সম্পর্কের "অনেকগুলি" প্রতিনিধিত্বকারী একটি নেভিগেশন সম্পত্তি অবশ্যই আইকোলিকেশন প্রয়োগ করে এমন একটি প্রকারটি ফেরত পাঠাতে হবে, যেখানে টি সম্পর্কের অন্য প্রান্তে অবজেক্টের ধরণ। - পোকো প্রক্সি এমএসডিএন তৈরির জন্য প্রয়োজনীয়তা

এমএসডিএন সম্পর্কিত সংজ্ঞা ও পরিচালনা সম্পর্কিত আরও তথ্য


2
সুতরাং, তার সাথে, Listঅনেক ভাল হওয়া উচিত, তাই না?
জান কার্লো ভাইরে

3
@JanCarloViray - আমি ব্যবহারের প্রবণতা Listঅনেক। যদিও এর সর্বাধিক ওভারহেড রয়েছে এটি সর্বাধিক কার্যকারিতা সরবরাহ করে।
ট্র্যাভিস জে

1
তালিকা অনুসারে বাছাই করার ক্ষমতাটির চেয়ে তাদের সূচকগুলি আরও সংজ্ঞায়িত করা হয় (একটি পূর্ণসংখ্যার সূচক থাকা কোনও জিনিসকে বাছাই করা সহজ করে তোলে তবে এটি কোনও প্রয়োজন নয়)।
ফুগ

2
আপনার সম্পাদনার বিষয়ে, কোনও সম্পত্তি কোনও ইন্টারফেস টাইপের মধ্যে সীমাবদ্ধ করা মেমরির পক্ষে নয় তবে এনক্যাপসুলেশন সম্পর্কে। বিবেচনা করুন: private IEnumerable<int> _integers = new List<int> { 1, 2, 3 };হিসাবে একই মেমরির ব্যবহারprivate List<int> _integers = new List<int> { 1, 2, 3 };
phoog

13
@ ট্রাভিজেজে: List<T>এর একটি GetEnumerator()প্রয়োগ রয়েছে IEnumerable<T>, যা এর প্রয়োগ থেকে পৃথক হয় , যা একটি পরিবর্তনীয় কাঠামোর ধরণ দেয় List<T>.Enumerator। বেশিরভাগ প্রসঙ্গে, এই ধরণের স্ট্যান্ডেলোন হ্যাপ অবজেক্টের চেয়ে কিছুটা ভাল পারফরম্যান্স পাওয়া যাবে। কোডার তৈরি করার সময় যে সংকলকরা হাঁসের ধরণের গণক (যেমন সি # এবং ভিবিএন নেট উভয়ই করেন) এর সুবিধা নিতে পারে foreach। যদি এর আগে List<T>কাস্ট করা হয় তবে পদ্ধতিটি গাদা-বরাদ্দ হওয়া বস্তুটি ফিরিয়ে দেবে, অপটিমাইজেশনটিকে অসম্ভব বলে উপস্থাপন করবে। IEnumrable<T>foreachIEnumerable<T>.GetEnumerator()
সুপারক্যাট

85

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


3
<টি> তালিকার সাথে কি তুলনা করা যায়?
জান কার্লো ভাইরে

12
List<T>প্রয়োগ ICollection<T>
ব্যয়কারী 0

অ-জেনেরিক কোনওভাবে ICollectionআইটেম যুক্ত করার অনুমতি দেয় না, তবে এটি এখনও একটি দরকারী সংযোজন IEnumerable<T>কারণ এটি একটি Countসদস্য সরবরাহ করে যা সাধারণত সমস্ত কিছু গণনা করার চেয়ে অনেক দ্রুত। নোট যে যদি IList<Cat>বা ICollection<Cat>একটি আশা কোডে পাস করা হয়েছে IEnumerable<Animal>, Count()এক্সটেনশন পদ্ধতি ফাস্ট যদি এটা অ জেনেরিক প্রয়োগ হতে হবে ICollection, কিন্তু না থাকেন তাহলে সেটি শুধুমাত্র জেনেরিক ইন্টারফেস প্রয়োগ একটি টিপিক্যাল যেহেতু ICollection<Cat>বাস্তবায়ন করা হবে না ICollection<Animal>
ক্যাট

58

সম্পর্কে আপনার প্রশ্নের জবাব List<T>:

List<T>একটি শ্রেণি; একটি ইন্টারফেস নির্দিষ্টকরণ বাস্তবায়নের আরও নমনীয়তার অনুমতি দেয়। একটি ভাল প্রশ্ন "কেন না IList<T>?"

এই প্রশ্নের উত্তর দেওয়ার জন্য, কী IList<T>যুক্ত করে তা বিবেচনা করুন ICollection<T>: পূর্ণসংখ্যার সূচক, যার অর্থ আইটেমগুলির কিছু স্বেচ্ছাচারিত ক্রম থাকে এবং সেই আদেশের সাথে উল্লেখ করে পুনরুদ্ধার করা যায়। এটি সম্ভবত বেশিরভাগ ক্ষেত্রেই অর্থবহ নয়, যেহেতু আইটেমগুলিকে সম্ভবত বিভিন্ন প্রসঙ্গে আলাদাভাবে অর্ডার দেওয়া দরকার।


21

আইকোলিকেশন এবং আইইনুমেবলের মধ্যে কিছু বুনিয়াদি পার্থক্য রয়েছে

  • আইনিউমারেবল - এনুমুলেটর পাওয়ার জন্য কেবলমাত্র getEnumerator পদ্ধতি রয়েছে এবং লুপিংয়ের অনুমতি দেয়
  • আইকোলিকেশনটিতে অতিরিক্ত পদ্ধতি রয়েছে: যুক্ত করুন, সরান, ধারণ করে, গণনা করুন, কপি করুন
  • আইকোল্লেশন আইএনউমারেবল থেকে উত্তরাধিকার সূত্রে প্রাপ্ত
  • আইকোলিকেশন দিয়ে আপনি অ্যাড / রিমুভ পদ্ধতিগুলি ব্যবহার করে সংগ্রহটি সংশোধন করতে পারেন। আইইনুমেবলের সাথে একই কাজ করার স্বাধীনতা আপনার নেই।

সাধারণ প্রোগ্রাম:

using System;
using System.Collections;
using System.Collections.Generic;

namespace StackDemo
{
    class Program 
    {
        static void Main(string[] args)
        {
            List<Person> persons = new List<Person>();
            persons.Add(new Person("John",30));
            persons.Add(new Person("Jack", 27));

            ICollection<Person> personCollection = persons;
            IEnumerable<Person> personEnumeration = persons;

            // IEnumeration
            // IEnumration Contains only GetEnumerator method to get Enumerator and make a looping
            foreach (Person p in personEnumeration)
            {                                   
               Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age);
            }

            // ICollection
            // ICollection Add/Remove/Contains/Count/CopyTo
            // ICollection is inherited from IEnumerable
            personCollection.Add(new Person("Tim", 10));

            foreach (Person p in personCollection)
            {
                Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age);        
            }
            Console.ReadLine();

        }
    }

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
    }
}

13

আমি এটি এইভাবে মনে করি:

  1. আইনিউমারেবলের একটি পদ্ধতি গেটইনিউমরেটর () রয়েছে যা কোনওটিকে সংগ্রহে থাকা মানগুলির মাধ্যমে পড়তে দেয় কিন্তু এতে লিখতে দেয় না। গণক ব্যবহারের বেশিরভাগ জটিলতা আমাদের জন্য সি # এর প্রতিটি বিবৃতিতে যত্ন নেওয়া হয়। আইনামেরেবলের একটি সম্পত্তি রয়েছে: কারেন্ট, যা বর্তমান উপাদানটি দেয়।

  2. আইকোলিকেশন আইনিউমেন্টেবল প্রয়োগ করে এবং কয়েকটি অতিরিক্ত বৈশিষ্ট্য যুক্ত করে যার মধ্যে সর্বাধিক ব্যবহার Count আইকোলিকেশনের জেনেরিক সংস্করণ অ্যাড () এবং সরান () পদ্ধতিগুলি প্রয়োগ করে।

  3. আইলিস্ট আইইনুমেবল এবং আইকোলিকেশন উভয়ই প্রয়োগ করে এবং আইটেমগুলিতে পূর্ণসংখ্যার সূচক অ্যাক্সেস যুক্ত করে (যা সাধারণত প্রয়োজন হয় না, কারণ ডাটাবেসে অর্ডার করা হয়)।


4
আপনি যা লিখেছেন তার উপর ভিত্তি করে আইকোলিকেশন এবং আইলিস্ট একই। আইলিলেশনে যা যুক্ত করা হয়েছে তা আইকোলিকেশনে বিদ্যমান নয় দয়া করে।
বেট করুন

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

7

ব্যবহারের প্রাথমিক ধারণাটি ICollectionহ'ল কিছু সীমাবদ্ধ তথ্যের পাঠ্য-অ্যাক্সেসের জন্য একটি ইন্টারফেস সরবরাহ করে। আসলে আপনার কাছে আইকোলিকেশন রয়েছে ount অ্যাকাউন্ট সম্পত্তি C IEnumerableআপনি কিছু লজিকাল পয়েন্ট অবধি পড়েন এমন ডেটার কয়েকটি চেইনের জন্য আরও উপযুক্ত, কিছু শর্ত স্পষ্টভাবে গ্রাহক দ্বারা নির্দিষ্ট করেছেন বা গণনার শেষ পর্যন্ত of


14
টিআইএল যা ICollectionকেবল পঠনযোগ্য ICollection<T>তা নয় while
কার্ল জি

2

নেভিগেশন বৈশিষ্ট্যগুলিকে সাধারণত ভার্চুয়াল হিসাবে সংজ্ঞায়িত করা হয় যাতে তারা অলস লোডিংয়ের মতো নির্দিষ্ট সত্ত্বা ফ্রেমওয়ার্ক কার্যকারিতার সুবিধা নিতে পারে।

যদি কোনও নেভিগেশন সম্পত্তি একাধিক সত্তাকে ধরে রাখতে পারে (যেমন একাধিক থেকে এক বা একাধিক সম্পর্কের মতো) তবে এর ধরণটি অবশ্যই তালিকা হতে হবে যাতে আইকোলিকেশন এর মতো এন্ট্রি যুক্ত করা, মুছে ফেলা এবং আপডেট করা যেতে পারে।

https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net- MVC-অ্যাপ্লিকেশন


2

আমি অতীতে যা করেছি তা হ'ল আমার অভ্যন্তরীণ শ্রেণীর সংগ্রহগুলি ব্যবহার করে ঘোষণা করা হয়েছে IList<Class>, ICollection<Class>বা IEnumerable<Class>(স্থির তালিকা থাকলে) আমার সংগ্রহস্থলের কোনও পদ্ধতিতে আমাকে নিম্নোক্ত কয়েকটি নম্বর করতে হবে কি না তার উপর নির্ভর করে: গণনা করা, সাজান / অর্ডার করা বা সংশোধন করা । যখন আমাকে কেবলমাত্র বস্তুর উপর List<Class>দিয়ে অঙ্কের (এবং সম্ভবত বাছাই করা) দরকার হবে তখন আমি সংগ্রহের সাথে একটি IEnumerable পদ্ধতিতে কাজ করতে একটি টেম্প তৈরি করি । আমি মনে করি সংগ্রহটি তুলনামূলকভাবে ছোট হলেই এই অনুশীলনটি কার্যকর হবে, তবে এটি সাধারণভাবে, আইডিকে ভাল অভ্যাস হতে পারে। কেন এটি ভাল অনুশীলন করবে না তার কোনও প্রমাণ থাকলে দয়া করে আমাকে সংশোধন করুন।


0

যুক্তি দিয়ে / বাক্সের বাইরে চিন্তা করার চেষ্টা করি এবং আপনার প্রশ্নের এই তিনটি ইন্টারফেস পরিষ্কারভাবে বুঝতে পারি:

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

এর অর্থ এই উদাহরণটিতে থাকা সমস্ত আইটেম এবং উপাদানগুলি গণনা করাও সম্ভব।

সিস্টেমটি প্রয়োগ করে এমন প্রতিটি শ্রেণি.কলেশন.আইআনম্যারেবল ইন্টারফেস এছাড়াও getEnumerator পদ্ধতি প্রয়োগ করে যা কোনও আর্গুমেন্ট গ্রহণ করে না এবং একটি সিস্টেম.কলেশন.আইনমেন্টর উদাহরণ দেয়।

সিস্টেমের সংগ্রহসমূহ of সংগ্রহসমূহ Iশিক্ষক ইন্টারফেস সি ++ পুনরাবৃত্তকারীগুলির সাথে খুব একই রকম আচরণ করে।

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

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

এটি সমস্ত যুক্তিসঙ্গত, যৌক্তিক, যৌক্তিক এবং এটি উপলব্ধি করে যে System. Collections.ICol নির্বাচন ইন্টারফেসটি System. সংগ্রহগুলি থেকে উত্তরাধিকারসূত্রে পাওয়া যায় Eআনামুল্য ইন্টারফেস, কারণ তাত্ত্বিকভাবে প্রতিটি সংগ্রহগুলিও গণনাযোগ্য এবং পুনরাবৃত্ত উভয় এবং তাত্ত্বিকভাবে সমস্ত আইটেম এবং উপাদানগুলির উপর দিয়ে যাওয়া সম্ভব is প্রতিটি সংগ্রহে।

সিস্টেম.কলেকশনস.আইক্লেইশন ইন্টারফেস এমন একটি সীমাবদ্ধ গতিশীল সংগ্রহ উপস্থাপন করে যা পরিবর্তনযোগ্য হয়, যার অর্থ বিদ্যমান আইটেমগুলি সংগ্রহ থেকে সরিয়ে ফেলা যায় এবং একই আইটেমে নতুন আইটেম যুক্ত করা যায়।

এটি ব্যাখ্যা করে কেন System. Collections.ICol নির্বাচন ইন্টারফেসে "যোগ" এবং "সরান" পদ্ধতি রয়েছে।

কারণ সিস্টেম.কলেকশনস.আইক্লিকেশন ইন্টারফেসের সীমাবদ্ধ সংগ্রহগুলি তখন "সসীম" শব্দটি বোঝায় যে এই ইন্টারফেসের প্রতিটি সংগ্রহে সর্বদা এতে সীমাবদ্ধ সংখ্যক আইটেম এবং উপাদান থাকে।

সিস্টেমের সংগ্রহের গণনা Col সংগ্রহসমূহ ICআপনার ইন্টারফেসটি এই নম্বরটি প্রত্যাখ্যান করে।

সিস্টেম.কলেশনস.আইনিউরেবল ইন্টারফেসে সিস্টেম.কলেশনস.আইক্লেইশন ইন্টারফেসের এই পদ্ধতিগুলি ও বৈশিষ্ট্যগুলি নেই, কারণ এটি সিস্টেম.কলেশনস.আইনামিউরেবলের এই পদ্ধতি এবং বৈশিষ্ট্যগুলি সিস্টেম.কলেকশনস.ইলিকেশন ইন্টারফেসের রয়েছে।

যুক্তি আরও বলেছে যে প্রতিটি উদাহরণ যেগুলি গণনাযোগ্য এবং পুনরাবৃত্তিযোগ্য উভয়ই প্রয়োজনীয় সংগ্রহ এবং প্রয়োজনীয় পরিবর্তনীয় নয়।

যখন আমি পরিবর্তনশীল বলি, এর অর্থ হ'ল অবিলম্বে এমনটি ভাববেন না যে আপনি এমন কিছু থেকে এমন কিছু যুক্ত করতে বা মুছতে পারেন যা গুণনীয় এবং পুনরাবৃত্তিযোগ্য।

উদাহরণস্বরূপ, আমি যদি প্রাথমিক সংখ্যার কিছু সীমাবদ্ধ ক্রম তৈরি করেছি, উদাহরণস্বরূপ, প্রাথমিক সংখ্যাগুলির এই সীমাবদ্ধ ক্রমটি প্রকৃতপক্ষে System. Collections.IEumeume ইন্টারফেসের একটি উদাহরণ, কারণ এখন আমি একটি লুপের মধ্যে এই সীমাবদ্ধ ক্রমের সমস্ত মৌলিক সংখ্যার উপরে যেতে পারি কনসোল উইন্ডো বা স্ক্রিনে প্রতিটি মুদ্রণের মতো আমি তাদের প্রত্যেকের সাথে যা কিছু করতে চাই তা করুন, তবে মৌলিক সংখ্যার এই সীমাবদ্ধ ক্রমটি সিস্টেম.কলেশনস.আইক্লিকেশন ইন্টারফেসের উদাহরণ নয়, কারণ এটি এর অর্থবোধ করে না is প্রাথমিক সংখ্যার এই সীমাবদ্ধ ক্রমটিতে সম্মিলিত সংখ্যা যুক্ত করুন।

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

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

গতিবেগের গতিশীল মেমরি বরাদ্দকরণ এবং সিস্টেম.কলেশন.আইক্লেইশন ইন্টারফেসের পদ্ধতি এবং বৈশিষ্ট্যগুলি প্রার্থনা করার সময় সম্পন্ন করা উচিত System 1 পদ্ধতি এবং 0 টি বৈশিষ্ট্য)।

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

সংক্ষেপে সিস্টেম.কলেশনস.আইক্লিকেশন ইন্টারফেসটি বোঝায় না যে এটির উদাহরণটি অনুগামযোগ্য System

তাত্ত্বিকভাবে অর্ডার করা সেটটি হ'ল আনর্ডার্ড সেটগুলির বিশেষ কেস।

এটি সিস্টেমটিকেও সংগ্রহ করে।

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