সম্পত্তি গণনা বনাম গণনা () পদ্ধতি?


85

সংগ্রহের সাথে কাজ করা আমার কাছে বস্তুর সংখ্যা পাওয়ার দুটি উপায় রয়েছে; Count(সম্পত্তি) এবং Count()(পদ্ধতি) মূল পার্থক্য কী তা কি কেউ জানেন?

আমি ভুল হতে পারি, তবে আমি সবসময়ে Countশর্তাধীন বিবৃতিতে সম্পত্তিটি ব্যবহার করি কারণ আমি ধারণা করছি যে Count()পদ্ধতিটি সংগ্রহের বিরুদ্ধে কিছু প্রকারের জিজ্ঞাসা করে, যেখানে Countআমার আগেই 'পাওয়ার' আগে নির্ধারিত হয়ে গিয়েছিল। তবে এটি অনুমান - আমি ভুল না হলে পারফরম্যান্স প্রভাবিত হবে কিনা তা আমি জানি না।

সম্পাদনা: কৌতূহলের বাইরে, Count()সংগ্রহটি শূন্য হলে একটি ব্যতিক্রম ছুঁড়ে ফেলবে ? কারণ আমি নিশ্চিত যে Countসম্পত্তি কেবল 0 ফেরায়।


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

উত্তর:


110

Count()এক্সটেনশান পদ্ধতির উত্সটি ছিন্ন করে প্রকাশ করে যে এটি পরীক্ষা করে যে এটি বস্তুটি ICollection(জেনেরিক বা অন্যথায়) কিনা এবং যদি কেবলমাত্র অন্তর্নিহিত Countসম্পত্তিটি ফেরত দেয় :

সুতরাং, যদি আপনার কোড Countকল করার পরিবর্তে অ্যাক্সেস করে তবে Count()আপনি টাইপ চেকিং বাইপাস করতে পারেন - একটি তাত্ত্বিক পারফরম্যান্স সুবিধা তবে আমি সন্দেহ করি যে এটি লক্ষণীয় হবে!

// System.Linq.Enumerable
public static int Count<TSource>(this IEnumerable<TSource> source)
{
    checked
    {
        if (source == null)
        {
            throw Error.ArgumentNull("source");
        }
        ICollection<TSource> collection = source as ICollection<TSource>;
        if (collection != null)
        {
            return collection.Count;
        }
        ICollection collection2 = source as ICollection;
        if (collection2 != null)
        {
            return collection2.Count;
        }
        int num = 0;
        using (IEnumerator<TSource> enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                num++;
            }
        }
        return num;
    }
}

10
এটিকে প্রকট বিপরীত করার উদ্যোগ নেওয়ার জন্য +1, খুব সহায়ক।
বহুবর্ষ

7
তবে, মনে রাখবেন যে 3.5 Count()তে নন-জেনেরিক ICollectionইন্টারফেসের জন্য পরীক্ষা করে না । এটি কেবল। নেট 4 এ যুক্ত করা হয়েছিল 3.5 এবং 4 উভয়ই জেনেরিক ICollection<T>ইন্টারফেসের জন্য পরীক্ষা করে ।
থিওক

4
কোনও উপাদান নেই এমন ক্রমের উপর কলিং গণনা একটি ব্যতিক্রম ছুঁড়ে ফেলবে। তবে গণনা () ভাল কাজ করবে।
আমেশ

33

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

আমি বলছি না .Count()ভাল, আমি কেবল বলছি অন্যান্য বিবেচনা রয়েছে যা আপনি যে কোডটি লিখছেন তার পুনরায় ব্যবহারযোগ্যতার সাথে আরও বেশি আলোচনা করে।


4
আলোচনায় +1 মূল্যবান সংযোজন। কিছু কোড আমি বজায় রেখেছি কেবল সম্পত্তিটি ভেঙে দেওয়ার কারণে। অ্যাকাউন্টটি এইচটিএমএলজিটিপ্যাকের কোনও সংস্করণ আপগ্রেড থেকে বাঁচেনি।
ড্যান সলোভে

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

@ বাশার্ক ট্রু আমি মনে করি যদি আমরা বিকাশকারীর কোড বনাম ফ্রেমওয়ার্ক কোড পরিবর্তনের বিষয়ে বিবেচনা করি তবে সম্ভবত বিকাশকারী কোডটি পরিবর্তিত হবে। যদি ফ্রেমওয়ার্কে এই ধরণের পরিবর্তন আনা হয় তবে তা অনেক কিছুই ভেঙে ফেলত। Ditionতিহ্যগতভাবে তারা এই ক্ষেত্রে নতুন সংগ্রহ / ইন্টারফেস প্রবর্তন করে যাতে বিকাশকারীরা পছন্দসই মাইগ্রেশন করতে পারে।
অ্যারোনএলএস

20

.Count()পদ্ধতি পারে স্মার্ট যথেষ্ট হবে, বা প্রশ্ন টাইপ সম্পর্কে জানতে, এবং যদি তাই হয়, এটা হতে পারে অন্তর্নিহিত ব্যবহার .Countসম্পত্তি।

আবার, এটা নাও পারে।

আমি বলব এটি সংরক্ষণ করা নিরাপদ যে সংগ্রহটি যদি .Countনিজস্ব সম্পত্তি থাকে তবে এটি যখন পারফরম্যান্সের ক্ষেত্রে আসে তখন এটি আপনার সেরা বাজি হয়ে উঠবে।

যদি .Count()পদ্ধতিটি সংগ্রহের বিষয়ে না জানে, এটি এটির উপরে গণনা করবে যা একটি ও (এন) অপারেশন হবে।


4
Countসম্পত্তি ব্যবহার করা আরও ভাল হতে পারে তবে Count()পদ্ধতিটি তৈরির পদ্ধতি ICollection<T>.Countএখানে নথিভুক্ত করা হয়েছে: msdn.microsoft.com/en-us/library/bb338038(v=vs.110).aspx
নওফাল

আমি জানি না আপনি কীভাবে প্রায় সব কিছু জানেন।
স্নার

5

Count()পদ্ধতিটি একটি এক্সটেনশন পদ্ধতি যা একটি এর প্রতিটি উপাদানকে পুনরাবৃত্তি করে IEnumerable<>এবং সেখানে কতগুলি উপাদান থাকে তা ফিরিয়ে দেয়। উদাহরণস্বরূপ IEnumerableযদি আসলে একটি হয় List<>, সুতরাং এটি Countসমস্ত উপাদানগুলিকে পুনরাবৃত্ত করার পরিবর্তে সম্পত্তিটি ফিরিয়ে আনতে অনুকূলিত ।


আমার একটি তালিকা <> থাকা অবস্থায়ও আমি আমার কোডটি আরও জেনেরিক রাখতে গণনা () পদ্ধতিটি ব্যবহার করি। যখন আমি ক্লাসগুলিকে আইনিউমেবল <> যেখানে নির্দিষ্ট সংগ্রহের প্রয়োগের প্রয়োজন হয় না তা ব্যবহার করার জন্য রিফ্যাক্টর করি Its
আন্তোনিওআর

3

Count()লিনকিউ থেকে কোনও এক্সটেনশন পদ্ধতি হিসাবে রয়েছে - Countএটি হ'ল Listআসল। নেট সংগ্রহের অবজেক্টের একটি সম্পত্তি ।

এর ফলে, Count()প্রায় সর্বদা ধীর হয়ে যাবে, যেহেতু এটি সংগ্রহ / অনুসন্ধানযোগ্য বস্তুর গণনা করবে। একটি তালিকায়, সারি, স্ট্যাক ইত্যাদি ব্যবহার করুন Count। বা একটি অ্যারের জন্য - Length


3

সংক্ষিপ্ত সংস্করণ: আপনার যদি কোনও Countসম্পত্তি এবং কোনও Count()পদ্ধতির মধ্যে পছন্দ থাকে তবে সর্বদা সম্পত্তিটি বেছে নিন।

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


আমি মনে করি এই উত্তরটি গণনা সম্পত্তি ব্যবহার করার পক্ষে আরও যুক্তিসঙ্গত
এটি

3

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


3

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

সুতরাং তাদের উভয়েরই প্রায় অভিন্ন কাজ করা উচিত। গণনা সম্পত্তি সম্ভবত কিছুটা ভাল কারণ সেখানে কোনও ধরণের চেক করার দরকার নেই।

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