2010-03-26 25 views
25

मैं थोड़ा निम्नलिखित कोड है, जहां मैं बस ints के अनुक्रम से सभी 3s निकालना चाहते हैं उसके परिणाम से आश्चर्यचकित हूं:LINQ - छोड़ दिया गया है जबकि टूटा हुआ?

var sequence = new [] { 1, 1, 2, 3 }; 
var result = sequence.SkipWhile(i => i == 3); // Oh noes! Returns { 1, 1, 2, 3 } 

3 क्यों छोड़ी नहीं है?

मेरा अगला सोचा था, ठीक है, ऑपरेटर को छोड़कर चाल करना होगा:

var sequence = new [] { 1, 1, 2, 3 }; 
var result = sequence.Except(i => i == 3); // Oh noes! Returns { 1, 2 } 

सारांश में,

  • 3 को हटा छोड़कर, लेकिन यह भी गैर विशिष्ट तत्वों को हटा। Grr।
  • SkipWhile पिछले तत्व को छोड़ नहीं देता है, भले ही यह स्थिति से मेल खाता हो। Grr।

क्या कोई यह समझा सकता है कि SkipWhile अंतिम तत्व को क्यों नहीं छोड़ता है? और क्या कोई सुझाव दे सकता है कि ऊपर दिए गए अनुक्रम से '3' को हटाने के लिए मैं LINQ ऑपरेटर का उपयोग किस प्रकार कर सकता हूं?

+0

इसे SkipWhile (true) के रूप में सोचें। इसलिए, आपकी पहली हालत (i == 3) विफल हो जाती है। तो, यह SkipWhile (झूठा) बन जाता है और तो आगे क्या होता है? यह हर तत्व शेष देता है! –

उत्तर

51

यह टूटा नहीं है। SkipWhile केवल IEnumerable<T> की शुरुआत में आइटम छोड़ देगा। एक बार उस स्थिति को पूरा नहीं होने के बाद यह खुशी से शेष तत्वों को ले जाएगा। बाद में सड़क से मेल खाने वाले अन्य तत्वों को छोड़ दिया नहीं जाएगा।

int[] sequence = { 3, 3, 1, 1, 2, 3 }; 
var result = sequence.SkipWhile(i => i == 3); 
// Result: 1, 1, 2, 3 
+0

आह, अब मैं समझता हूं। धन्यवाद, अहमद। –

+7

मुझे अभी तक जला दिया गया है क्योंकि एमएसडीएन दस्तावेज उसको निर्दिष्ट नहीं करता है। क्या देता है? http://msdn.microsoft.com/en-us/library/system.linq.enumerable.skipwhile(v=vs.90).aspx –

+6

@StanR। - शायद आपको दस्तावेज़ीकरण को और सावधानीपूर्वक पढ़ने की जरूरत है? "एक अनुक्रम में तत्वों को बाईपास करता है * जब तक एक निर्दिष्ट शर्त सत्य * *** होती है और फिर शेष तत्वों को वापस लाती है ***" – JDB

17
var result = sequence.Where(i => i != 3); 
+1

या TakeWhile (i => i! = 3) – Nagg

+9

@Nagg 'TakeWhile' 3 से शुरू होने वाले अनुक्रम पर कुछ भी नहीं लौटाएगा, जैसे' {3,1,2,3} '। वांछित परिणाम सभी 3 एस को फ़िल्टर करना है, जो कि 'कहां' है। –

+0

उह, वाह, शुक्रवार ठीक है। जहां ऑपरेटर निश्चित रूप से चाल करेगा। [ओह]। फिर भी, जवाब नहीं देता क्यों SkipWhile अपेक्षा के अनुसार काम नहीं करता है। –

1

अहमद पहले से ही अपने प्रश्न का उत्तर, लेकिन यहाँ एक और विकल्प है:

var result = from i in sequence where i != 3 select i; 
2

SkipWhile और TakeWhile ऑपरेटरों छोड़ सकते हैं या एक दृश्य से तत्वों वापसी एक विधेय समारोह गुजरता है, जबकि (ट्रू रिटर्न)। पूर्ववर्ती कार्य को पारित करने वाला पहला तत्व मूल्यांकन की प्रक्रिया को समाप्त नहीं करता है।

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

2

एक समाधान जो आप उपयोगी पाते हैं वह सूची "FindAll" फ़ंक्शन का उपयोग कर रहा है।

List <int> aggregator = new List<int> { 1, 2, 3, 3, 3, 4 }; 
List<int> result = aggregator.FindAll(b => b != 3); 
संबंधित मुद्दे