কোন # তালিকা <> তে কোনও () ব্যবহার কী?


40

আমি সহকর্মীদের সাথে এটি নিয়ে আলোচনা করেছি , এবং সি # তে আমরা যে .Anyকোনও প্রদত্ত ব্যবহারের কী তা বুঝতে পারি না List<>

আপনি নীচের বিবৃতি মত অ্যারে একটি উপাদান এর বৈধতা পরীক্ষা করতে পারেন:

if (MyList.Any()){ ...}  //Returns true or false

যা ঠিক তেমনই same

if (MyList.Count() != 0) { ... }

এবং ifবিবৃতিটির অভিপ্রায় সম্পর্কে আরও সাধারণ, পাঠযোগ্য এবং স্পষ্ট ।

শেষ পর্যন্ত, আমরা এই চিন্তা নিয়ে আটকে গিয়েছিলাম:

.Any() ব্যবহার করা যেতে পারে, ঠিক পাশাপাশি কাজ করবে, তবে প্রোগ্রামারটির অভিপ্রায় সম্পর্কে কম পরিষ্কার, এবং এটি সেই ক্ষেত্রে ব্যবহার করা উচিত নয়।

তবে আমরা মনে করি এটি ঠিক হতে পারে না; আমরা অবশ্যই কিছু মিস করছি

আমরা কি?


40
কোনভাবে অভিপ্রায় সম্পর্কে কম স্পষ্ট হয়?
জে কে।

35
আমি আপনার দাবিটিকে চ্যালেঞ্জ জানাই যা Any()কম স্পষ্ট: Any()আমার কাছে আরও স্পষ্ট বলে মনে হচ্ছে, বিশেষত ল্যাম্বডা-শর্তের সাথে। আমার মাথায় ইংরেজি কোড অনুবাদ করা, if(MyList.Count(o => o > 10) > 0)হয়ে "আইটেম সংখ্যা আরো তুলনায় 10 থেকে 0 থেকে বেশি আছে কি?" যেহেতু if(MyList.Any(o => o > 10))হয়ে "সেখানে কোনো আইটেম 10 চেয়ে মহান?"
ব্লুরাজা - ড্যানি পিফ্লুঘিওফ্ট

3
@ সার্জবার্স - কেবলমাত্র যদি আপনি হেস্কেল / কার্যকরী নামকরণ পছন্দ করেন, যা বেশিরভাগ লোকেরা পছন্দ করে না।
Žদ্রো

4
@ ব্লুরাজা-ড্যানিপ্লুঘুফুট আমি সম্মত। আমি মনে করি যে কোনওটি আরও স্পষ্ট যেহেতু এটি যাকে একটি ম্যাজিক নম্বর হিসাবে বিবেচনা করা যেতে পারে তাকে সরিয়ে দেয়।
অ্যান্ডি

2
@SargeBorsch: এসকিউএল সমান্তরাল Anyহয় Exists। লিনক নামটি সম্ভবত হাস্কেল এবং পাইথন দ্বারা আরও অনুপ্রাণিত যার কোনও / সমস্ত ক্রিয়াকলাপ রয়েছে।
জ্যাকবিবি

উত্তর:


95

মনে রাখবেন যে Anyএকটি কাজ করে না List; এটি একটিতে কাজ করে IEnumerable, যা একটি কংক্রিটের ধরণের প্রতিনিধিত্ব করে যা কোনও Countসম্পত্তি থাকতে পারে এবং নাও করতে পারে । এটি সত্য যে এটির জন্য সর্বোত্তম জিনিসটি ব্যবহার করা অগত্যা নয় List, তবে এটি অবশ্যই একটি লিনকিউ ক্যোয়ারির শেষে কার্যকর হবে। এবং স্ট্যান্ডেলোন সংস্করণ অপেক্ষা আরও দরকারী হ'ল ওভাররাইড যা একটি প্রাকটিকেটের মতো লাগে WhereListপ্রেডিকেট- Anyএক্সটেনশন পদ্ধতির মতো সুবিধাজনক বা অভিব্যক্তির কাছাকাছি কোথাও এর মধ্যে অন্তর্নির্মিত কিছুই নেই ।

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


19
এই. পারফরমেন্স সরাইয়া, Any()একটি বিধেয় সাথে আছেন আরো ভাবপূর্ণ চেয়ে এর ওভাররাইড তুলনা Enumerable.Count()যে 0. সঙ্গে :) একটি বিধেয় লাগে
ড্যান জে

1
আমি মনে করি এটি মৌলিক বিষয়গুলি এত স্পষ্টভাবে ব্যাখ্যা করে যা উত্তরের উত্তম ব্যাখ্যা করে।
তারিক

2
আইএমএইচও, Existsএকটি শিকারী হিসাবে ঠিক যেমন সুবিধাজনক এবং Anyমতামতপূর্ণ। ব্যবহার Count != 0একটি উপর সম্পত্তি Listব্যবহার করে বেশি স্বাভাবিক Any()। এটি কেবল ব্যক্তিগত পছন্দ। আমিও পরিবর্তনের প্রচেষ্টা মাধ্যমে সর্বস্বান্ত করেছি _list_.Count()করতে _list_.Countআমার গ্রুপ এর কোডে। এটি আমার কাছে লক্ষণীয় পার্থক্য করেছে।
সানকাট 2000

55

একটি রান সময় পার্থক্য রয়েছে Count()ও (এন) যেখানে Any()ও (1) হতে পারে।


15
Count()অসীম পুনরাবৃত্তিকারীদের জন্যও থামবে না, যখন Any()হবে, কারণ এটি কেবল MoveNext()একবার কল করা দরকার ।
জন পুর্ডি

3
সংক্ষিপ্ত এবং সঠিক, তবে এটি একটি উত্তর চেয়ে একটি মন্তব্য হিসাবে আরও পড়তে। প্রোগ্রামাররা এমন উত্তরগুলি পছন্দ করে যেগুলি কেন ব্যাখ্যা করে এবং একটি পরিমাপের ব্যাখ্যা সরবরাহ করে। আপনার উত্তরটি সম্পাদনা এবং ও (1) কেন গুরুত্বপূর্ণ (সম্ভবত) গুরুত্বপূর্ণ হতে পারে তার প্রসারকে বিবেচনা করুন

খুব ভাল উত্তরটি শিখেছে আমার গণনার পরিবর্তে কোনও ব্যবহার করা উচিত == 0: d
মনস্টার এমএমআরপিজি


1
নির্দিষ্ট ক্ষেত্রে List, কার্য সম্পাদন একই কারণ এক্সটেনশনটি সম্পত্তিটি ব্যবহার করে। ICollectionইন্টারফেস প্রয়োগকারী সমস্ত সংগ্রহের ক্ষেত্রে সত্য ।
থারকিল হলম-জ্যাকবসেন

9

প্রকৃতপক্ষে, মনে রাখবেন যে তালিকা.কাউন্ট সম্পত্তি রয়েছে এবং তারপরে রয়েছে গণনাযোগ্য C অ্যাকাউন্ট পদ্ধতি।

আপনার উদাহরণস্বরূপ, আপনি Enumerable.Count()পদ্ধতিটি ব্যবহার করছেন , যার ফলশ্রুতিতে গণনার প্রতিটি একক আইটেমটি পুনরাবৃত্তি করতে হবে। এটি কল করার চেয়ে স্পষ্টভাবে ধীর, Any()যা বিদ্যমান থাকলে কেবল প্রথম আইটেমটির পুনরাবৃত্তি প্রয়োজন।

সম্পাদনা করুন:

মন্তব্যে এটি উল্লেখ করা হয়েছিল, ঠিক তাই, যদি Enumerable.Count()সম্প্রসারণের পদ্ধতিটি সমস্ত আইটেমগুলির মধ্যে পুনরাবৃত্তি করার প্রয়োজন হয় না যদি এটি সনাক্ত করে যে গণনাযোগ্যও একটি হতে পারে ICollection<T>। সুতরাং একটি ক্ষেত্রে, সম্পত্তি বা পদ্ধতি List<T>ব্যবহার করে Countআসলে কোনও পার্থক্য আসে না।

হিসাবযোগ্য : অ্যাকাউন্ট উত্স:

public static int Count<TSource>(this IEnumerable<TSource> source) {
    if (source == null) throw Error.ArgumentNull("source");
    ICollection<TSource> collectionoft = source as ICollection<TSource>;
    if (collectionoft != null) return collectionoft.Count;
    ICollection collection = source as ICollection;
    if (collection != null) return collection.Count;
    int count = 0;
    using (IEnumerator<TSource> e = source.GetEnumerator()) {
        checked {
            while (e.MoveNext()) count++;
        }
    }
    return count;
}

যথেষ্ট ফর্সা। .আর হিসাব সম্পত্তি ব্যবহার সম্পর্কে কি? এটি কি পাঠকে উল্লেখযোগ্যভাবে দ্রুততর করে তুলবে না, সম্ভবত কলিংয়ের চেয়েও দ্রুত বা এমনকি দ্রুত।
গিল বালির

4
একটি সঙ্গে List<T>কর্মক্ষমতা পার্থক্য তুচ্ছ হবে। তাই আপনি যা পছন্দ করেন তা ব্যবহার করুন। তবে অন্যান্য ধরণের আইনিম্যারেবলের জন্য, আপনি কেবল Count()(পদ্ধতি) এর মধ্যে বাছাই করতে পারেন Any(), এবং সেই ক্ষেত্রে Any()আপনার ব্যবহারের ক্ষেত্রে সর্বদা সুস্পষ্ট বিজয়ী হবে এবং পছন্দ করা উচিত। এটি মূল্যবান জন্য, আমি মনে করি Any()এটি যথেষ্ট পঠনযোগ্য এবং পরিষ্কার clear
স্যস্তান

@ সান্ হ্যাঁ যদি না হয় যদি অযৌক্তিকভাবে একটি সমষ্টিতে নিক্ষেপ করা যায় তবে তা অনুকূলিত করা যায় এবং এটি কোনও বিষয় নয়।
এসবেন স্কোভ পেডারসেন

2
Count()হিসাবে একই জটিলতা রয়েছে Countজন্য ICollectionযেহেতু এক্সটেনশন পদ্ধতি তারপর iterating পরিবর্তে সম্পত্তি ব্যবহার করে, গুলি।
থারকিল হলম-জ্যাকবসেন

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

6

একটি আশ্চর্যজনক প্রশ্ন - আমি অভিপ্রায়টির list.Any()চেয়ে আরও পরিষ্কার হওয়ার উদ্দেশ্যটি খুঁজে পাই list.Count()!=0

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

Any()পদ্ধতিটি ব্যবহারের উদ্দেশ্যটি সম্পূর্ণ পরিষ্কার - তালিকার কোনও উপাদান রয়েছে কিনা তা আপনি জানতে চান।

Count()!=0অন্যদিকে অভিব্যক্তির অভিপ্রায়টি পাঠকের পক্ষে সুস্পষ্ট নয়। তালিকাটি খালি আছে কি না তা প্রকাশের মাধ্যমে আপনাকে জানায় অবশ্যই তা কঠিন নয়। প্রশ্নগুলি উত্থাপিত হয়েছে কারণ আপনি এটি স্ট্যান্ডার্ড পদ্ধতিটি ব্যবহার না করে এই বিশেষ পদ্ধতিতে লিখেছেন। আপনি কেন Count()স্পষ্টভাবে ব্যবহার করবেন ? যদি তালিকার কোনও উপাদান রয়েছে কিনা আপনার যদি সত্যই জেনে রাখা দরকার তবে আপনি কেন পুরো তালিকাটি প্রথমে গণনা করতে চান? আপনি 1 এ পৌঁছানোর সাথে সাথে আপনার কাছে ইতিমধ্যে আপনার উত্তর রয়েছে। যদি উত্সটি বৃহত্তর (সম্ভবত অসীম) সংগ্রহের উপরে পুনরাবৃত্তি হয় বা স্ক্যুলে অনুবাদ করা হয় তবে এটি একটি বড় পার্থক্য কর্মক্ষমতা অনুযায়ী করতে পারে। সুতরাং সম্ভবত গণনা () এর সুস্পষ্ট ব্যবহারটি একটি স্থগিত জিজ্ঞাসাটি কার্যকর করতে বাধ্য করা বা কোনও পুনরাবৃত্তিকে অনুসরণ করতে বাধ্য?

তবে উত্সটি হ'ল একটি List<T>যেখানে Count()ও (1) এবং এর কোনও পার্শ্ব প্রতিক্রিয়া নেই। তবে কোডটি যদি এই সম্পত্তির উপর নির্ভর করে List<T>, তবে কেন প্রপার্টিটি ব্যবহার করবেন না Countযা আরও স্পষ্টভাবে ইঙ্গিত করে যে আপনি কোনও ও (1) অপারেশনটি কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই প্রত্যাশা করছেন?

যেমনটি লেখা হয়েছে, অযথা আরও জটিল এবং অভিপ্রায়টি অস্পষ্ট বাদে list.Count()!=0ঠিক list.Any()তেমনটি করে।


আমি উভয়ই পড়েছি, "তালিকায় কোনও আইটেম রয়েছে?" Count()এর একটি অন্তর্নিহিত রূপান্তর রয়েছে যা আমি ব্যবহার এড়াতে চাই, তবে এটি অস্পষ্ট নয়। সংকলক এটিকে অপ্টিমাইজ করতে পারে, যা এটি কেবল অযত্ন কোডিং করে।
সানকাট 2000

2

এটা কি শুধু কথা? Anyআসলেই কিছু না বলে একটি বিশেষণ। জাভা থেকে আসা, আমি এটিকে কল করব isNonEmptyযার একটি ক্রিয়া রয়েছে। কোনও এসকিউএল লোক পছন্দ করতে পারে EXISTS। তবে সম্ভবত Anyসি # সিস্টেমে সবচেয়ে উপযুক্ত।

শব্দ পছন্দটি যাই হোক না কেন, একবার এটি ব্যবহারে অভ্যস্ত হয়ে উঠলে এটি অবশ্যই আরও পরিষ্কার হবে। আপনি কি জিজ্ঞাসা করবেন " more than zeroবিয়ারের বোতলগুলি কি আছে "? আপনি কি "প্রত্যাশিত লোকেরা one or more" না, সেখানে নেই "উত্তর দেওয়ার আগে তাদের গণনা শুরু করবেন বলে আশা করবেন any?


1
আপনি " Any()Any(o => true)
লিনকিউ

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