2010-08-24 95 views

回答

32

有幾種方法,你可以做到這一點。 for循環,而不是

    1. 使用一組布爾標誌
    2. 使用LINQ獲得list.First(),然後在的foreach list.Skip(1)
  • 18

    事情是這樣的:

    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 2010-08-24 03:25:07

    +2

    這是StackOverflow獲得專利的易問題競賽:) – geofftnz 2010-08-24 03:32:51

    +1

    發揮良好的先生,恭喜:) – Hamza 2010-08-24 03:36:17

    2

    想不出任何東西,但

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

    這裏是一個高性能的解決方案:

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

    編輯:這裏是一個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

    雖然這在技術上滿足要求,但它比使用「第一個」標誌來表示其他人發佈的可讀性要低得多。 – 2010-08-24 03:28:36

    +2

    @ Paul:效率更高,我不明白爲什麼它的可讀性顯着降低。 – Ani 2010-08-24 03:31:22

    +0

    不知道如何比使用'第一'標誌更高效。 – Babar 2010-08-24 05:50:35

    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

    聞起來像Python的字典。__items__ 我喜歡它! – Hovis 2012-03-06 23:22:39

    61

    我喜歡LINQ的方式,但沒有跳過(1),這樣一來,你也可以在列表中使用它的最後一個項目,你的代碼保持乾淨恕我直言:)

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

    我不喜歡這種方法,因爲它不嚴格準確。例如,如果物品不止一次出現,並且也是第一個或最後一個物品,那麼您將不止一次觸發第一個或最後一個條件。或者如果有些物品是平等的,他們也可以多次解僱。 – 2015-12-25 06:23:00

    +0

    @Sahuagin問題是關於測試項目是否是第一個。如果你清除了其他部分,這意味着你正在測試項目是否僅僅是第一項,你的合理關注將得到緩解。 – ErTR 2016-06-21 07:30:30

    相關問題