লিনকুই রিং: বিশাল সংগ্রহের জন্য যে কোনও () বনাম অন্তর্ভুক্ত ()


103

বস্তুর বিশাল সংগ্রহ দেওয়া, নিম্নলিখিতগুলির মধ্যে পারফরম্যান্সের পার্থক্য কি আছে?

সংগ্রহ। সামগ্রীগুলি :

myCollection.Contains(myElement)

Enumerable.Any :

myCollection.Any(currentElement => currentElement == myElement)

7
এর 10'000.000 এর সংগ্রহ। বিজয়ী 300% জন্য রয়েছে। তবে এটি নীচে উল্লিখিত রূপগুলি বিবেচনা করার উপযুক্ত।
এসডিআরেজ

উত্তর:


143

Contains()এটি একটি উদাহরণ পদ্ধতি এবং এর কার্য সম্পাদন মূলত সংগ্রহের উপর নির্ভর করে। উদাহরণস্বরূপ, Contains()একটি উপর Listহে (ঢ), যখন হয় Contains()একটি HashSetহে (1) হয়।

Any()এটি একটি এক্সটেনশন পদ্ধতি, এবং প্রতিটি সামগ্রীতে প্রতিনিধি প্রয়োগ করে কেবল সংগ্রহের মধ্য দিয়ে যাবে। সুতরাং এটি ও (এন) এর জটিলতা রয়েছে।

Any()যদিও আপনি কোনও প্রতিনিধি পাস করতে পারেন তাই আরও নমনীয়। Contains()শুধুমাত্র একটি বিষয় গ্রহণ করতে পারেন।


27
Containsএটির বিরুদ্ধেও একটি এক্সটেনশন পদ্ধতি IEnumerable<T>(যদিও কিছু সংগ্রহের নিজস্ব Containsউদাহরণ পদ্ধতি রয়েছে)। আপনি যেমনটি বলেছেন, Anyতার চেয়ে আরও নমনীয় Containsকারণ আপনি এটিকে একটি কাস্টম প্রিকেটটি পাস করতে পারেন তবে এটি কিছুটা দ্রুত Contains হতে পারে কারণ এটি প্রতিটি উপাদানগুলির জন্য ডেলিগেটের অনুরোধ করার প্রয়োজন হয় না।
লুক

1
যে কোনও () সংগ্রহের সমস্ত বস্তুর উপর ক্রিয়াকলাপ সম্পাদন করে বা এটি প্রথম ম্যাচের সাথে শেষ হয়?
Quarkly

1
অন্তত উত্স অনুসারে , এটি প্রথম ম্যাচে থামবে। All()একইভাবে কাজ করে।
এটিয়েন ডি মার্টেল

13

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

এছাড়াও নোট করুন যে আপনার উদাহরণে অপারেটরটি Any()ব্যবহার করছে ==যা রেফারেনশিয়াল সমতার জন্য পরীক্ষা করবে, যখন Containsব্যবহার করবে IEquatable<T>বা Equals()পদ্ধতিটি, যা ওভাররাইড হয়ে যেতে পারে।


4
.র সাথে আপনি সহজেই বৈশিষ্ট্যের তুলনা করতে পারেন। । কনটেইনগুলির সাহায্যে আপনি কেবলমাত্র বস্তুর তুলনা করতে পারেন এবং বৈশিষ্ট্যের তুলনা করার জন্য আপনার অতিরিক্ত আইকুয়ালিটি কম্পিউটারের প্রয়োজন।
msfanboy

1
@ এমএসফ্যানবয়: এটি সত্য, তবে প্রশ্নটি বিশেষত পারফরম্যান্স নিয়ে ছিল এবং পুরো বস্তুর তুলনা দেখিয়েছিল। সুতরাং আমি মনে করি না যে এটি এখানে প্রাসঙ্গিক।
tsc

4

আমি মনে করি যে এটি প্রয়োগ myCollectionকরা Contains()হয় কী ধরনের উপর নির্ভর করে । উদাহরণস্বরূপ যদি বাছাই করা বাইনারি ট্রি হয় তবে এটি আরও স্মার্ট অনুসন্ধান করতে পারে। এছাড়াও এটি উপাদানটির হ্যাশটিকে অ্যাকাউন্টে নিতে পারে। Any()অন্যদিকে শর্তটি সন্তুষ্টকারী প্রথম উপাদান না পাওয়া পর্যন্ত সংগ্রহের মাধ্যমে গণনা করা হবে element যদি অবজেক্টটির চৌকস অনুসন্ধানের পদ্ধতি ছিল তবে এর জন্য কোনও অপ্টিমাইজেশন নেই।


0

() রয়েছে এটি একটি এক্সটেনশন পদ্ধতি যা আপনি সঠিক উপায়ে ব্যবহার করলে দ্রুত কাজ করতে পারে। প্রাক্তন হিসাবে:

var result = context.Projects.Where(x => lstBizIds.Contains(x.businessId)).Select(x => x.projectId).ToList();

এটি কোয়েরি দেবে

SELECT Id FROM Projects INNER JOIN (VALUES (1), (2), (3), (4), (5)) AS Data(Item) ON Projects.UserId = Data.Item

অন্যদিকে যে কোনও () সর্বদা ও (এন) এর মাধ্যমে পুনরাবৃত্তি করে।

আশা করি এটি কাজ করবে ....

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