2010-08-24 103 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

    相关问题