আইকোলিকেশন <টি> বনাম তালিকা <টি> সত্তা ফ্রেমওয়ার্কে


114

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

আমি List<T>আমার ক্লাসে ব্যবহার করে আসছি এবং এটি দুর্দান্ত কাজ করেছে।

এখন আমি কিছু ডকুমেন্টেশন পড়েছি এবং এতে বলা হয়েছে যে আমার ব্যবহার করা উচিত ছিল ICollection<T>। আমি এটিতে পরিবর্তিত হয়েছি, এবং এটি এমনকি কোনও মডেল প্রসঙ্গে পরিবর্তনও ঘটায় নি। এটি কি কারণ List<T>এবং ICollection<T>উত্তরাধিকারী উভয়ই IEnumerable<T>, এবং এটিই কি EF এর জন্য প্রয়োজনীয়?

যাইহোক, যদি এটি হয় তবে EF ডকুমেন্টেশন কেন এটির IEnumerable<T>পরিবর্তে প্রয়োজন বলে দেয় না ICollection<T>?

যাই হোক না কেন, আমি যা করেছি তার কোনও ডাউনসাইড রয়েছে, নাকি আমার এটি পরিবর্তন করা উচিত?

উত্তর:


113

সত্তা ফ্রেমওয়ার্ক ব্যবহার করবে ICollection<T>কারণ এটির জন্য Addক্রিয়াকলাপ সমর্থন করা দরকার যা IEnumerable<T>ইন্টারফেসের অংশ নয় ।

এছাড়াও মনে রাখবেন আপনি সেটা ব্যবহার ICollection<T>, আপনি নিছক যেমন প্রকাশক ছিল List<T>বাস্তবায়ন। List<T>এটি সঙ্গে বরাবর এনেছে IList<T>, ICollection<T>এবং IEnumerable<T>

আপনার পরিবর্তনের জন্য, List<T>কাজ করেও ইন্টারফেসের মাধ্যমে প্রকাশ করা ভাল পছন্দ । ইন্টারফেস চুক্তিটি সংজ্ঞা দেয় তবে বাস্তবায়ন নয়। বাস্তবায়ন পরিবর্তন হতে পারে । কিছু উদাহরণস্বরূপ, সম্ভবত বাস্তবায়নটি একটি হতে পারে HashSet<T>, উদাহরণস্বরূপ। (এটি এমন একটি মানসিকতা যা আপনি কেবল সত্ত্বা ফ্রেমওয়ার্কের চেয়ে বেশি ব্যবহার করতে পারেন, উপায় দ্বারা A


2
সুতরাং .... শুধু আমার আরও কিছুটা বোঝার জন্য - তালিকা আইলিস্টের উত্তরাধিকার সূত্রে প্রাপ্ত আইকোলিকেশনকে উত্তরাধিকার সূত্রে প্রাপ্ত, যা আইনামিউরেবলের উত্তরাধিকার সূত্রে প্রাপ্ত?
উইল

3
হ্যাঁ, এই চেইন। List<T>ঐ ইন্টারফেস (প্রতিটি বাস্তবায়ন হয়েছে IList<T>, ICollection<T>, IEnumerable<T>উত্তরাধিকার অনুক্রমের কারণে)। সমাপ্তির জন্য, IList<T>এছাড়াও অ জেনেরিক আপ IList, ICollectionএবং IEnumerableইন্টারফেস।
অ্যান্টনি পেগ্রাম

আপনাকে ধন্যবাদ ... আইএক্সএক্সএক্সের কয়েকটি বৈশিষ্ট্য এখনও আমার বোধ থেকে দূরে রয়েছে! আপনি বুঝতে পেরেছেন, তবে একটি শেষ জিনিস যা আমাকে বিরক্ত করছে, অন্য আইএক্সএক্সের উত্তরাধিকারী আইনিউমারেবল হয়, যদি একটি আইয়ানামেবল কেবলই পড়া হয় তবে কীভাবে এটি আইমনামেবল যুক্ত হবে? ... যদি এটি খুব জটিল হয় তবে চিন্তা করবেন না, যখন আমার কিছুটা সময় থাকবে, আমি প্রতিফলককে সরিয়ে দেওয়ার চেষ্টা করব!
Wil

10
সাধারণ লিনাক অপারেশনগুলি জিনিসগুলিকে যুক্ত বা রূপান্তরিত করে না, এগুলি কেবল ফিল্টার, গোষ্ঠী, প্রকল্প ইত্যাদি For কেবলমাত্র কেবল পঠনযোগ্য ক্রমগুলি এই অপারেশনগুলিকে সমর্থন করার জন্য প্রয়োজনীয়। যখন আপনার একটি লিনক সরবরাহকারী যেমন অ্যান্টি ফ্রেমওয়ার্ক যা ডেটার অধ্যবসায়ের সাথে সম্পর্কিত হয়, যোগ করার ক্ষমতাটি যথেষ্ট পরিমাণে বেনিফিট যার জন্য একটি বিফিয়ার ইন্টারফেসের প্রয়োজন হয়, যা ICollection<T>পার্টিতে আমন্ত্রণ জানায় (এবং এই ইন্টারফেসটি সাথে আনবে IEnumerable<T>, তাই "স্বাভাবিক" "লিনক অপারেশনগুলি এখনও বৈধ)।
অ্যান্থনি পেগ্রাম

@ অ্যান্থনি পেগ্রাম: আমি মনে করি যে তিনটি ইন্টারফেস প্রয়োগ করা আবশ্যক তা বলা কঠোরভাবে ভুল। যেহেতু IList <T> আইকোলিকেশন <T> উত্তরাধিকার সূত্রে প্রাপ্ত হয় যা আইনিম্যুয়াল <T> উত্তরাধিকার সূত্রে আসে, তাই তালিক <T> কেবলমাত্র IList <T> বাস্তবায়ন করার জন্য এটি যথেষ্ট।
সিজে 7

51

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

ইন্টারফেসের মধ্যে পার্থক্য এখানে:

  • IEnumerable<T> কেবল পঠনযোগ্য
  • আপনি একটিতে আইটেমগুলি যুক্ত এবং মুছে ফেলতে পারেন ICollection<T>
  • আপনি এ এলোমেলো অ্যাক্সেস (সূচী দ্বারা) করতে পারেন List<T>

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

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

ICollection<T> সমর্থিত, এবং আপনাকে কোয়েরি এবং ডেটা পরিবর্তন উভয়কেই অনুমতি দেবে, তাই এটি ব্যবহার করুন।

কারণটির সাথে List<T>কাজ শুরু করার কারণ হ'ল ইএফ বাস্তবায়ন শেষের দিকে ফিরে আসে। তবে এটি আপনার কোয়েরি শৃঙ্খলার শেষে, শুরুতে নয়। সুতরাং আপনার বৈশিষ্ট্যগুলি ICollection<T>তৈরি করা এটিকে আরও স্পষ্ট করে তুলবে যে EF আপনার একগুচ্ছ এসকিউএল তৈরি করে এবং List<T>আপনি যে লিনক ব্যবহার করেন তা প্রতিটি স্তরের জন্য অনুসন্ধান না করে কেবল শেষে আসে ।


8

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


1
আমি বুঝতে চাই - আপনি তালিকা <টি> সহ একই ক্রিয়াকলাপ (এবং আরও অনেক কিছু) করতে পারেন। আইকোলিকেশন <টি> কেন? <T> তালিকা কেন নেই? সহজ এবং আরও শক্তিশালী দেখায়।
monstro

তালিকা <টি> কার্যকর আইকোলিকেশন এবং আইনিউমেন্টেবল। আরও অপারেশন তবে এর সাথে আরও ওভারহেড আসে।
আয়রনসেস

4

যদিও প্রশ্নটি বহু বছর পূর্বে পোস্ট করা হয়েছে, এখনও কেউ একই দৃশ্যের সন্ধান করলে এটি কার্যকর হয়।

একটি সাম্প্রতিক [২০১৫] কোডপ্রজেক্ট নিবন্ধ রয়েছে যা নমুনা কোডের সাথে অনেকগুলি বিশদ এবং গ্রাফিকাল উপস্থাপনার মধ্যে পার্থক্য ব্যাখ্যা করে । এটি সরাসরি ইএফ-তে নিবদ্ধ নয় তবে এখনও আশা করি এটি আরও বেশি সহায়ক হবে:

আইকুয়্যারেবল বনাম আইকোয়েলেবল বনাম আইকোলিকেশন বনাম আইডি অভিধান অভিধানের তালিকা

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