LINQ जहाँ vs takewhile है


99

मैं takewhile और जहां LINQ विधियों के बीच अंतर प्राप्त करना चाहता हूं। मुझे MSDN से निम्न डेटा मिला है। लेकिन मेरे लिए यह समझ में नहीं आया।

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

एक विधेय के आधार पर मूल्यों का एक क्रम दाखिल करता है।

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

एक अनुक्रम से तत्वों को तब तक लौटाता है जब तक कि एक निर्दिष्ट स्थिति सत्य है।

सभी मतों का स्वागत है।


1
अच्छा सवाल - टेकवेल पर इन्टेलिसेंस अभी भी कहता है "जब तक एक निर्दिष्ट स्थिति सत्य है" तत्व वापस लौटते हैं। यह बहुत अच्छी तरह से जहाँ एक ही के रूप में समझा जा सकता है। शब्दांकन कुछ ऐसा होना चाहिए जैसे "रिटर्न एलीमेंट्स ... जब तक कि स्थिति असत्य के रूप में मूल्यांकन नहीं करती है"।
पीटर

जवाबों:


159

टेकविले तब रुकता है जब स्थिति झूठी होती है, जहां जारी रहता है और स्थिति से मेल खाते सभी तत्वों को ढूंढता है

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

30

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

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 @ डेविड बी और @Albin सुननबो जवाब पर निर्भर करता है
मोहम्मद वर्णमाला

नहीं, यह तब तक आइटम लौटाएगा जब तक कि शर्त पूरी नहीं की जाती। इस मामले में, 1, 3, और 5 शर्त को पूरा करते हैं (वे <= 5) हैं।
जिम मिसल्ट

8

MSDN कहता है

Enumerable.TakeWhile Method

एक अनुक्रम से तत्वों को तब तक लौटाता है जब तक कि निर्दिष्ट स्थिति सत्य है, और फिर शेष तत्वों को छोड़ देता है।

Enumerable.Where

एक विधेय के आधार पर मूल्यों का एक क्रम दाखिल करता है।

अंतर यह है कि पहले गैर-मिलान से शेष तत्वों को छोड़ दिया जाता है Enumerable.TakeWhile चाहे वे स्थिति से मेल खाते हों या नहीं


6

हालांकि मौजूदा उत्तर सही हैं, उनमें से कोई भी इंगित नहीं करता है कि आप परिणाम के समान होने पर TakeWhile का उपयोग क्यों करना चाहते हैं: प्रदर्शन। मान लीजिए कि आपके पास 2 बिलियन आइटमों के साथ एक ऑर्डर की गई सूची है, और आप चाहते हैं कि दिए गए वाल्ल्यू से कम (शायद 10 या 15 आइटम) हैं। जहां क्लॉज सभी 2 बिलियन आइटमों की जांच करेगा, वहीं टेकवाइल जैसे ही बंद होगा, यह आपके द्वारा दिए गए मूल्य के बराबर या उससे अधिक मूल्य का पता लगाएगा


5

पारित किए गए अनुक्रम का क्रम पूरी तरह से महत्वपूर्ण है TakeWhile, जो कि जल्द से जल्द एक समर्पित रिटर्न के रूप में समाप्त हो जाएगाfalse , जबकि Whereपहले falseमूल्य से परे अनुक्रम का मूल्यांकन करना जारी रखेगा ।

के लिए एक आम उपयोग TakeWhile बड़े, महंगे, या यहां तक ​​कि अनंत enumerables के आलसी मूल्यांकन के दौरान होता है जहां आपको अनुक्रम के आदेश के बारे में अतिरिक्त ज्ञान हो सकता है।

उदाहरण दिए गए अनुक्रम:

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

ए के .Whereपरिणामस्वरूप एक अनंत लूप होगा जो कि गणना करने योग्य भाग का मूल्यांकन करने की कोशिश करेगा:

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

जबकि .TakeWhile, एक और ज्ञान है कि enumerables आरोही है के साथ सशस्त्र, आंशिक अनुक्रम का मूल्यांकन करने की अनुमति देगा:

var result = InfiniteSequence()
    .TakeWhile(n => n < 100)
    .Count();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.