লিনকিউ যেখানে বনাম গ্রহণযোগ্য


99

আমি TakeWhile& Whereলিনকিউ পদ্ধতির মধ্যে পার্থক্য পেতে চাই MS আমি এমএসডিএন থেকে নিম্নলিখিত তথ্য পেয়েছি B তবে এটি আমার কাছে বোধগম্য হয়নি

Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) 

একটি প্রাকটিকের উপর ভিত্তি করে মানগুলির ক্রম ফিল্টার করে।

TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

নির্দিষ্ট শর্তটি যতক্ষণ সত্য ততক্ষণ ক্রম থেকে উপাদানগুলি ফেরত দেয়।

সমস্ত মতামত স্বাগত জানানো হয়।


4
ভাল প্রশ্ন - টেকওহাইলের ইনটেলিসেন্স এখনও বলেছে "নির্দিষ্ট শর্তটি যতক্ষণ সত্য হয় ততক্ষণ উপাদানগুলি ফেরত দেয়"। এটি খুব ভাল যেখানে একটি হিসাবে একই ব্যাখ্যা করা যেতে পারে। শব্দের পরিবর্তে শর্তটি মিথ্যা হিসাবে মূল্যায়ন না করা পর্যন্ত "উপাদানগুলি ফেরত দেয় ..." এর মতো কিছু হওয়া উচিত।
পিটার

উত্তর:


161

TakeWhileশর্তটি মিথ্যা হলে বন্ধ হয়ে যায়, Whereচালিয়ে যায় এবং শর্তের সাথে মেলে সমস্ত উপাদান সন্ধান করে

var intList = new int[] { 1, 2, 3, 4, 5, -1, -2 };
Console.WriteLine("Where");
foreach (var i in intList.Where(x => x <= 3))
    Console.WriteLine(i);
Console.WriteLine("TakeWhile");
foreach (var i in intList.TakeWhile(x => x <= 3))
    Console.WriteLine(i);

দেয়

Where
1
2
3
-1
-2
TakeWhile
1
2
3

31

Where ম্যাচ সন্ধানে পুরো ক্রমটি পরীক্ষা করতে পারে।

Enumerable.Range(1, 10).Where(x => x % 2 == 1)
// 1, 3, 5, 7, 9

TakeWhile এটি প্রথম অ-ম্যাচের মুখোমুখি হওয়া বন্ধ করে দেয়।

Enumerable.Range(1, 10).TakeWhile(x => x % 2 == 1)
// 1

সংক্ষিপ্ত এবং মিষ্টি, নিখুঁত উত্তর
নিউরন

10

এমএসডিএন বলছে

Enumerable.TakeWhile Method

নির্দিষ্ট শর্তটি যতক্ষণ সত্য ততক্ষণ ক্রম থেকে উপাদানগুলি ফেরত দেয় এবং তারপরে অবশিষ্ট উপাদানগুলি এড়িয়ে যায়।

Enumerable.Where

একটি প্রাকটিকের উপর ভিত্তি করে মানগুলির ক্রম ফিল্টার করে।

পার্থক্যটি হ'ল Enumerable.TakeWhile প্রথম অ-ম্যাচ থেকে বাকি উপাদানগুলিকে এড়িয়ে যায় তারা শর্তের সাথে মেলে কিনা


9

বলুন আপনার একটি অ্যারে রয়েছে এতে রয়েছে [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]। এখন:

var whereTest = array.Where(i => i <= 5);ফিরে আসবে [1, 3, 5, 0, 2, 4]

var whileTest = array.TakeWhile(i => i <= 5);ফিরে আসবে [1, 3, 5]


আমি মনে করি যে টেস্ট কেবল ১ টি ফিরে আসবে @ ডেভিড বি এবং @ আলবিন সুন্নানবো উত্তরগুলির উপর নির্ভরশীল
মোহাম্মদ

না, শর্তটি পূরণ না হওয়া পর্যন্ত এটি আইটেমগুলি ফিরিয়ে দেবে। এই ক্ষেত্রে, 1, 3, এবং 5 শর্ত পূরণ করে (সেগুলি <= 5)।
জিম মিশেল

7

পাস করা ক্রমের ক্রমটি একেবারে সমালোচিত TakeWhile, যা ভবিষ্যদ্বাণীপূর্ণ রিটার্নের সাথে সাথেই শেষ হয়ে যাবে false, যেখানে Whereপ্রথম falseমানের বাইরে ক্রমটি মূল্যায়ন করতে থাকবে ।

এর জন্য একটি সাধারণ ব্যবহার TakeWhileহ'ল বড়, ব্যয়বহুল বা এমনকী অসীম সংখ্যাগরিষ্ঠের অলস মূল্যায়নের সময় যেখানে সিকোয়েন্স ক্রম সম্পর্কে আপনার অতিরিক্ত জ্ঞান থাকতে পারে।

যেমন ক্রম দেওয়া:

IEnumerable<BigInteger> InfiniteSequence()
{
    BigInteger sequence = 0;
    while (true)
    {
        yield return sequence++;
    }
}

A এর .Whereফলস্বরূপ একটি অসীম লুপ হবে যা গণনার অংশের মূল্যায়ন করার চেষ্টা করছে:

var result = InfiniteSequence()
    .Where(n => n < 100)
    .Count();

যেখানে একটি .TakeWhile, এবং এই জ্ঞান দিয়ে সজ্জিত হয়েছে যে গণনাগুলি আরোহী, তারা আংশিক ক্রমটি মূল্যায়নের অনুমতি দেবে:

var result = InfiniteSequence()
    .TakeWhile(n => n < 100)
    .Count();

4
প্রকৃতপক্ষে. এটি টোকেনের ক্রম পার্সিংয়ের জন্যও সত্যই কার্যকর।
আলুয়ান হাদাদাদ

7

বিদ্যমান উত্তরগুলি সঠিক হলেও, ফলাফলগুলি একই রকম হয় যদি আপনি টেকহাইল ব্যবহার করতে চান তবে তাদের মধ্যে কেউই নির্দেশ দেয় না : পারফরম্যান্স। মনে করুন আপনার কাছে এতে 2 বিলিয়ন আইটেম রয়েছে এমন একটি অর্ডার তালিকা রয়েছে এবং আপনি যেগুলি (সম্ভবত 10 বা 15 আইটেম) একটি প্রদত্ত শূন্যের চেয়ে কম চান। ধাঁধাটি সমস্ত 2 বিলিয়ন আইটেম পরীক্ষা করবে, যখন আপনার সরবরাহ করা মানের চেয়ে সমান বা তার চেয়ে বড় মান খুঁজে পাওয়ার সাথে সাথে টিকহাইল থামবে will

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