লিনকিউ: নো নো বনাম অল দো না


272

প্রায়শই আমি যাচাই করতে চাই যে সরবরাহিত মানের তালিকার কোনওটির সাথে মেলে কিনা (যেমন বৈধকরণের সময়):

if (!acceptedValues.Any(v => v == someValue))
{
    // exception logic
}

সম্প্রতি, আমি লক্ষ্য করেছি যে রিসার্পার আমাকে এই প্রশ্নগুলিকে আরও সহজ করার জন্য জিজ্ঞাসা করেছেন:

if (acceptedValues.All(v => v != someValue))
{
    // exception logic
}

স্পষ্টতই, এটি যৌক্তিকভাবে অভিন্ন, সম্ভবত কিছুটা বেশি পাঠযোগ্য (যদি আপনি প্রচুর গণিত করেছেন) তবে আমার প্রশ্ন: এই ফলাফলটি কোনও পারফরম্যান্স হিটের ফল দেয়?

এটি হওয়া উচিত বলে মনে হয় (অর্থাত্ .Any()এটি শর্ট সার্কিটের .All()মতো শোনাচ্ছে , যদিও এটির মতো শোনাচ্ছে না) তবে আমার এটিকে প্রমাণ করার মতো কিছুই নেই। প্রশ্নগুলি একই সমাধান করবে কিনা, বা রিশার্পার আমাকে বিপথগামী করছে কিনা সে সম্পর্কে কি কারও গভীর জ্ঞান আছে?


6
লিনক কোডটি কী করছে তা দেখার জন্য আপনি কি তা ছড়িয়ে দেওয়ার চেষ্টা করেছেন?
আরকিউকিউ

9
এক্ষেত্রে আমি আসলে যদি (! स्वीकृतভ্যালিউজ.কন্টেনস (কিছু ভ্যালু)) নিয়ে যাই তবে অবশ্যই এই প্রশ্নটি ছিল না :)
সিজেরো

2
@ সিএসজিও আমি সম্মত উপরেরটি ছিল আসল যুক্তিটির একটি সরলীকরণ (সম্ভবত অতিরিক্ত-সরলকরণ)।
চিহ্নিত করুন

1
"এটির মতো মনে হয় (যেমন .একটি () এটি শর্ট সার্কিটের মতো শোনাচ্ছে, অন্যদিকে। সমস্ত () এটির মতো শোনাচ্ছে না)" - শব্দ অন্তর্দৃষ্টি সহ কারও কাছে নয়। আপনি যে লজিক্যাল ইক্যুয়ালেন্সটি লক্ষ্য করেছেন তা বোঝায় যে এগুলি সমানভাবে সংক্ষিপ্ত-সার্কিটযোগ্য able একটি মুহুর্তের চিন্তাভাবনা প্রকাশ করে যে নন-যোগ্যতার মামলাটি আসার সাথে সাথেই সমস্ত ত্যাগ করতে পারে।
জিম বাল্টার

3
আমি এই বিষয়ে সার্বজনীনভাবে রিসার্পারের সাথে একমত নই। চিন্তার বুদ্ধিমান ট্রেন লিখুন। যদি একটি প্রয়োজনীয় আইটেমটি অনুপস্থিত আপনি একটি ব্যতিক্রম নিক্ষেপ চাইলে: if (!sequence.Any(v => v == true))। আপনি শুধুমাত্র সবকিছু কে কনর্ফাম করে যদি একটি নির্দিষ্ট স্পেসিফিকেশন অবিরত করতে চান: if (sequence.All(v => v < 10))
টিমো

উত্তর:


344

Allআইএলএসপি অনুসারে বাস্তবায়ন (যেমন আমি আসলে গিয়েছিলাম এবং দেখেছি, "ভাল, সেই পদ্ধতিটি কিছুটা কাজ করে ..." আমি যদি প্রভাবটির পরিবর্তে তত্ত্বটি নিয়ে আলোচনা করতাম তবে আমি করতে পারি)।

public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    if (predicate == null)
    {
        throw Error.ArgumentNull("predicate");
    }
    foreach (TSource current in source)
    {
        if (!predicate(current))
        {
            return false;
        }
    }
    return true;
}

Anyআইএলএসপি অনুসারে বাস্তবায়ন :

public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    if (predicate == null)
    {
        throw Error.ArgumentNull("predicate");
    }
    foreach (TSource current in source)
    {
        if (predicate(current))
        {
            return true;
        }
    }
    return false;
}

অবশ্যই উত্পাদিত আইএলটিতে কিছু সূক্ষ্ম পার্থক্য থাকতে পারে। তবে না, নেই। আইএল বেশ একইরকম, তবে ভবিষ্যদ্বাণীপূর্ণ ম্যাচের বিরুদ্ধে সত্য প্রত্যাবর্তনের বিপরীতে এবং ভবিষ্যদ্বাণীপূর্ণ অমিলের ভিত্তিতে মিথ্যা প্রত্যাবর্তনের পক্ষে in

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

মনে হবে নিয়ম কেউ অনুভূতি যে একমাত্র নিচে আসে if(determineSomethingTrue)সহজ এবং তুলনায় আরো পাঠযোগ্য if(!determineSomethingFalse)। এবং ন্যায়পরায়ণতার সাথে, আমি মনে করি যে তারা প্রায়শই if(!someTest)বিভ্রান্তিকর বলে মনে হয় যখন সমান ভার্বোসটি এবং জটিলতার বিকল্প পরীক্ষা থাকে যা আমরা যে শর্তটি সম্পাদন করতে চাই তার জন্য সত্য ফিরে আসবে। তবুও সত্যই, আমি ব্যক্তিগতভাবে আপনি যে দুটি বিকল্প দিচ্ছেন তার মধ্যে একটির পক্ষে কিছু করার পক্ষে খুঁজে পাচ্ছি না এবং ভবিষ্যদ্বাণীটি আরও জটিল হলে প্রাক্তনের দিকে খুব সামান্য ঝুঁকতে চাই।

* আমি যেমন বুঝতে পারি না তেমন বিভ্রান্তিকর নয়, তবে আমি উদ্বেগজনকভাবেই উদ্বিগ্ন যে আমি বুঝতে পারি না এমন সিদ্ধান্তের কিছু সূক্ষ্ম কারণ রয়েছে এবং এটি বুঝতে "কয়েকবার কিছু নেই, তারা ঠিক সিদ্ধান্ত নিয়েছে এইভাবে, অপেক্ষা করুন আমি আবার কোডটির এই বিটটি কী দেখছিলাম? ... "


8
আমি লাইনগুলির পিছনে কী করা হয় তা নিশ্চিত নই, তবে আমার পক্ষে আরও বেশি পঠনযোগ্য: যদি (কোনওটি না হয়) তবে (সমস্ত সমান নয়)।
ভিকিয়াআর

49
একটি বড় পার্থক্য আছে যখন আপনার গণনার কোনও মান থাকে না। 'যে কোনও' সর্বদা মিথ্যা প্রত্যাবর্তন করবে এবং 'সব' সর্বদা সত্য ফিরে আসবে। সুতরাং একটির থেকে অন্যটির যৌক্তিক সমতুল্য বলা সম্পূর্ণ সত্য নয়!
আরনৌদ

44
@ আরনৌদ Anyফিরবে falseএবং তাই !Anyফিরে আসবে true, তাই তারা অভিন্ন।
জন হান্না

11
@ আরনাড এমন কোনও ব্যক্তি নেই যারা মন্তব্য করেছিলেন যে বলেছিলেন যে যে কোনও এবং সমস্ত যুক্তিযুক্তভাবে সমতুল্য। বা অন্যভাবে বলতে গেলে, মন্তব্য করা সমস্ত ব্যক্তি এটি বলে নি যে কোনও এবং সমস্ত যুক্তিযুক্তভাবে সমতুল্য। সমতুল্যতা হ'ল যে কোনও (প্রিকিকেট) এবং সমস্ত (! ভবিষ্যদ্বাণীক)।
জিম বাল্টার

7
@ ম্যাক্সডিকিনসন এটি মোটেও কোনও পার্থক্য নয়, কারণ আপনি বিপরীত পূর্বাভাসের তুলনা করছেন না। সমতূল্য !test.Any(x => x.Key == 3 && x.Value == 1)যে ব্যবহারসমূহ Allহয় test.All(x => !(x.Key == 3 && x.Value == 1))(যা প্রকৃতপক্ষে সমতূল্য test.All(x => x.Key != 3 || x.Value != 1))।
জন হান্না

55

আপনি এই এক্সটেনশন পদ্ধতিগুলি আপনার কোডটিকে আরও পঠনযোগ্য করে তুলতে পারেন:

public static bool None<TSource>(this IEnumerable<TSource> source)
{
    return !source.Any();
}

public static bool None<TSource>(this IEnumerable<TSource> source, 
                                 Func<TSource, bool> predicate)
{
    return !source.Any(predicate);
}

এখন আপনার আসল পরিবর্তে

if (!acceptedValues.Any(v => v == someValue))
{
    // exception logic
}

তুমি বলতে পার

if (acceptedValues.None(v => v == someValue))
{
    // exception logic
}

6
ধন্যবাদ - আমি ইতিমধ্যে আমাদের কমন্স লাইব্রেরিতে এগুলি বাস্তবায়নের কথা ভাবছিলাম, তবে এখনও সিদ্ধান্ত নেওয়া হয়নি যে এটি এখনও ভাল ধারণা। আমি সম্মত হই যে তারা কোডটি আরও পঠনযোগ্য করে তোলে তবে আমি উদ্বিগ্ন যে তারা পর্যাপ্ত মান যুক্ত না করে।
চিহ্নিত করুন

2
আমি কারও খোঁজ করেছিলাম না এবং খুঁজে পেলাম না। এটি অনেক বেশি পাঠযোগ্য।
ছড়া

আমাকে নাল চেক যোগ করতে হয়েছিল: রিটার্ন উত্স == নাল || ! source.Any (সম্পৃক্ত);
ছড়া

27

উভয়েরই অভিন্ন পারফরম্যান্স থাকবে কারণ ফলাফল নির্ধারণের পরে উভয়ই গণনা বন্ধ Any()করে দেয় - প্রথম আইটেমে উত্তীর্ণ প্রাকটিক মূল্যায়ন করে trueএবং All()প্রথম আইটেমের উপর প্রাকটিক মূল্যায়ন করে false


21

All প্রথম অ-মিলের শর্ট সার্কিট, সুতরাং এটি কোনও সমস্যা নয়।

সূক্ষ্মতার একটি ক্ষেত্র তা

 bool allEven = Enumerable.Empty<int>().All(i => i % 2 == 0); 

সত্য. ক্রমের সমস্ত আইটেম সমান।

এই পদ্ধতির আরও তথ্যের জন্য, গণনার জন্য ডকুমেন্টেশনগুলির সাথে পরামর্শ করুন ll সমস্ত


12
হ্যাঁ, তবে bool allEven = !Enumerable.Empty<int>().Any(i => i % 2 != 0)সত্য।
জন হান্না

1
@ জনের অর্থহীনভাবে কেউ নেই! = সবই। অর্থহীনভাবে আপনার কাছে হয় বা সমস্ত কিছুই ব্যতীত। সেই অ্যান্টনিটির জন্য +1
রুন এফএস

পুনঃটুইট শব্দার্থগতভাবে এবং যুক্তিযুক্তভাবে "" যেখানে এটি অসত্য নয় এমন কোনও ... "সত্যই" সমস্ত যেখানে এটি সত্য তা "হিসাবে একই। উদাহরণস্বরূপ "যেখানে আমাদের সংস্থা থেকে গৃহীত প্রকল্পগুলির কোনওটি নেই?" সবসময় একই উত্তর থাকবে "অন্যান্য সংস্থাগুলির গৃহীত সমস্ত প্রকল্প কোথায়?" ...
জন হান্না

... এখন, এটি সত্য যে "সমস্ত আইটেমগুলি হ'ল ..." ধরে ধরে আপনার বাগ থাকতে পারে তার মানে "সমস্ত আইটেম ... যেহেতু কমপক্ষে একটি আইটেম যা অন্তত একটি আইটেম যা পরীক্ষাটি সম্পন্ন করে ... "খালি সেটটির জন্য সর্বদা সত্য, আমি এটি নিয়ে মোটেই বিতর্ক করি না। আমি যুক্ত করেছিলাম যে "আইটেমগুলির মধ্যে কোনওটিই ..." ধরে নিয়ে একই সমস্যাটি ঘটতে পারে তার মানে কমপক্ষে একটি আইটেম পরীক্ষাটি সম্পন্ন করে না, যেহেতু "আইটেমগুলির কোনওটিই" ... খালি সেটটির ক্ষেত্রেও সর্বদা সত্য । এটি এমন নয় যে আমি অ্যান্টনির বক্তব্যের সাথে একমত নই, এটি আমার মনে হয় যে এটি দুটি আলোচনার মধ্যে অন্যটির জন্যও রয়েছে।
জন হান্না

@ জন আপনি লজিকের কথা বলছেন এবং আমি ভাষাবিজ্ঞানের কথা বলছি। মানব মস্তিষ্ক একটি নেতিবাচক প্রক্রিয়া করতে পারে না (আগে ইতিবাচক প্রক্রিয়া করার আগে এটি এটিকে তুচ্ছ করতে পারে) সুতরাং সেই অর্থে উভয়ের মধ্যে বেশ পার্থক্য রয়েছে। এটি আপনার প্রস্তাবিত যুক্তিকে ভুল করে তোলে না
রুন এফএস

8

All()ক্রমের সমস্ত উপাদান একটি শর্ত পূরণ করে কিনা তা নির্ধারণ করে।
Any()কোনও ক্রমের কোনও উপাদান শর্তটি সন্তুষ্ট করে কিনা তা নির্ধারণ করে।

var numbers = new[]{1,2,3};

numbers.All(n => n % 2 == 0); // returns false
numbers.Any(n => n % 2 == 0); // returns true

7

এই লিঙ্ক অনুযায়ী

যে কোনও - কমপক্ষে একটি ম্যাচের জন্য চেক

সমস্ত - সমস্ত মিল যে চেক


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

6

অন্যান্য উত্তরগুলি যেমন ভালভাবে কভার করেছে: এটি পারফরম্যান্সের বিষয়ে নয়, এটি স্পষ্টতা সম্পর্কে।

আপনার উভয় বিকল্পের জন্য বিস্তৃত সমর্থন:

if (!acceptedValues.Any(v => v == someValue))
{
    // exception logic
}

if (acceptedValues.All(v => v != someValue))
{
    // exception logic
}

তবে আমি মনে করি এটি আরও ব্যাপক সমর্থন অর্জন করতে পারে :

var isValueAccepted = acceptedValues.Any(v => v == someValue);
if (!isValueAccepted)
{
    // exception logic
}

কিছু উপেক্ষা করার আগে কেবল বুলিয়ান গণনা করা (এবং নামকরণ করা) এটি মনে মনে অনেকটা পরিষ্কার করে দেয়।


3

আপনি যদি গণনার উত্সটি একবার দেখে নেন তবে আপনি দেখতে পাবেন যে এর বাস্তবায়ন Anyএবং Allবেশ কাছাকাছি:

public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
    if (source == null) throw Error.ArgumentNull("source");
    if (predicate == null) throw Error.ArgumentNull("predicate");
    foreach (TSource element in source) {
        if (predicate(element)) return true;
    }
    return false;
}

public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
    if (source == null) throw Error.ArgumentNull("source");
    if (predicate == null) throw Error.ArgumentNull("predicate");
    foreach (TSource element in source) {
        if (!predicate(element)) return false;
    }
    return true;
}

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

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