2010-08-24 14 views
25

का पहला तत्व है या नहीं कहें कि मेरे पास फ़ोरैच लूप है।मैं कैसे जांचूं कि कोई इकाई फ़ोरैच लूप

मुझे लूप के पहले ऑब्जेक्ट के साथ कुछ करना है जो मुझे किसी अन्य ऑब्जेक्ट के साथ नहीं करना है।

मैं कैसे जांचूं कि वर्तमान में लूप में मौजूद आइटम पहली वस्तु है या नहीं।

उत्तर

32

ऐसे कई तरीके आप ऐसा कर सकते हैं कि कर रहे हैं। पाश बजाय

  • के लिए

    1. उपयोग एक सेट एक बूलियन ध्वज
    2. उपयोग Linq list.First() और फिर list.Skip से अधिक foreach (1)
  • 18

    कुछ इस तरह:

    using (var erator = enumerable.GetEnumerator()) 
    { 
        if (erator.MoveNext()) 
        { 
         DoActionOnFirst(erator.Current); 
    
         while (erator.MoveNext()) 
          DoActionOnOther(erator.Current); 
        } 
    } 
    

    संपादित करें:

    bool first = true; 
    
    foreach(var item in items) 
    { 
        if (first) 
        { 
         item.firstStuff(); 
         first = false; 
        } 
        item.otherStuff(); 
    } 
    
    2
    bool first = true; 
    foreach(var foo in bar) 
    { 
        if (first) 
        { 
        // do something to your first item 
        first = false; 
        } 
        // do something else to the rest 
    } 
    
    +0

    grr, जल्दी नहीं रहता है पर्याप्त! geofftnz की पोस्ट नहीं देखा। – Hamza

    +2

    यह स्टैक ओवरव्लो पेटेंट आसान प्रश्न दौड़ है :) – geofftnz

    +1

    अच्छी तरह से खेला सर, बधाई :) – Hamza

    2

    कुछ भी नहीं सोच सकते हैं लेकिन

    var processedFirst = false; 
    foreach(var x in items) { 
        if(!processedFirst) { 
         ProcessFirst(x); 
         processedFirst = true; 
        } 
    
    11

    यहाँ एक performant समाधान है और यहाँ एक LINQ है एक:

    if (enumerable.Any()) 
        { 
         DoActionOnFirst(enumerable.First()); 
    
         foreach (var item in enumerable.Skip(1)) 
          DoActionOnOther(item); 
        } 
    

    संपादित करें: वस्तुओं पर कार्रवाई Func<TItem, TResult> को आबंटित हस्ताक्षर है, तो आप कर सकते हैं:

    enumerable.Select((item, index) => index == 0 ? GetResultFromFirstItem(item) : GetResultFromOtherItem(item)); 
    
    +3

    हालांकि यह तकनीकी रूप से आवश्यकताओं को पूरा करता है, यह 'पहले' ध्वज का उपयोग करने के लिए काफी कम पठनीय है जैसा कि अन्य ने पोस्ट किया है। –

    +2

    @ पॉल: यह अधिक कुशल है, और मुझे नहीं लगता कि यह काफी कम पठनीय क्यों है। – Ani

    +0

    'पहले' ध्वज का उपयोग करने की तुलना में यह सुनिश्चित नहीं है कि यह अधिक कुशल कैसे है। – Babar

    2

    इस एक कोशिश करने के लिए

    bool IsFirst = true; 
    
    foreach(DataRow dr in dt.Rows) 
    { 
        if (IsFirst) 
        { 
         // do some thing 
         IsFirst = false; 
        }  
    } 
    
    4

    यह प्रत्येक ऑब्जेक्ट के साथ एक सरणी में इंडेक्स प्राप्त करने के लिए एक सामान्य समाधान है। यदि यह पहला है तो परीक्षण परीक्षण करना चाहिए।

     List<String> entries = new List<string>(); 
         entries.Add("zero"); 
         entries.Add("one"); 
         entries.Add("two"); 
    
         Dictionary<int, String> numberedEntries = new Dictionary<int, string>(); 
         int i = 0; 
         entries.ForEach(x => numberedEntries.Add(i++, x)); 
         foreach (KeyValuePair<int, String> pair in numberedEntries) { 
          Console.WriteLine(pair.Key + ": " + pair.Value); 
         } 
    

    इस सेटअप में, KeyValuePair की मुख्य सूचकांक है और मान एक स्ट्रिंग मेरे उदाहरण में, कि सूचकांक में वस्तु है, लेकिन किसी भी वस्तु वहाँ रखा जा सकता है। यह थोड़ा ओवरहेड जोड़ता है, लेकिन आवश्यकता होने पर सूची के सूचकांक में किसी ऑब्जेक्ट को निर्धारित करने के लिए इसका उपयोग किया जा सकता है।

    +0

    पाइथन के निर्देश की तरह बदबू आ रही है।__items__ मुझे यह पसंद है! – Hovis

    61

    मैं Linq तरीका पसंद है, लेकिन छोड़ें (1), इस तरह के बिना आप भी एक सूची में अंतिम आइटम के लिए उपयोग कर सकते हैं और अपने कोड स्वच्छ imho :)

    foreach(var item in items) 
    { 
        if (items.First()==item) 
         item.firstStuff(); 
    
        else if (items.Last() == item) 
         item.lastStuff(); 
    
        item.otherStuff(); 
    } 
    
    +5

    मुझे इस दृष्टिकोण को पसंद नहीं है क्योंकि यह कड़ाई से सटीक नहीं है। यदि एक आइटम एक से अधिक बार मौजूद है, उदाहरण के लिए, और यह पहली या आखिरी वस्तु भी है, तो आप पहली या आखिरी स्थिति को एक से अधिक बार आग लगा देंगे। या अगर कुछ वस्तुओं में समानता है, तो वे इसे एक से अधिक बार भी आग लगा सकते हैं। –

    +0

    @Sahuagin प्रश्न परीक्षण आइटम के बारे में है यह पहले या नहीं है। यदि आप भाग को छोड़कर अन्यथा साफ़ करते हैं, जिसका अर्थ है कि आप केवल पहले या नहीं होने के लिए आइटम का परीक्षण कर रहे हैं, तो आपकी सही चिंताओं को शांत कर दिया जाएगा। – ErTR

    संबंधित मुद्दे