如何检查实体是否是foreach循环的第一个元素

Dis*_*ive 39 .net c# foreach

说我有一个foreach循环.

我必须对循环的第一个对象做一些事情,我不需要对任何其他对象做任何事情.

如何检查当前在循环中的项目是否是第一个对象.

Fil*_*sen 88

我喜欢Linq的方式,但没有Skip(1),这样你也可以用它作为列表中的最后一项,你的代码仍然是干净的imho :)

foreach(var item in items)
{
    if (items.First()==item)
        item.firstStuff();

    else if (items.Last() == item)
        item.lastStuff();

    item.otherStuff();
}
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢这种方法,因为它不是严格准确的.例如,如果一个项目出现多次,并且也是第一个或最后一个项目,那么您将多次触发第一个或最后一个条件.或者如果某些项目具有相同性,它们也可以多次触发它. (9认同)
  • @Sahuagin问题是关于是否首先测试项目。如果清除else if部分,这意味着您正在测试项目是否仅在第一或第二,则您的正当担忧会得到缓解。 (2认同)

Jer*_*ing 39

有几种方法可以做到这一点.

  1. 请改用for循环
  2. 设置布尔标志
  3. 使用Linq获取list.First()然后foreach over list.Skip(1)


geo*_*tnz 26

像这样的东西:

bool first = true;

foreach(var item in items)
{
    if (first)
    {
        item.firstStuff();
        first = false;
    }
    item.otherStuff();
}
Run Code Online (Sandbox Code Playgroud)


Ani*_*Ani 15

这是一个高性能的解决方案:

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

        while (erator.MoveNext())
            DoActionOnOther(erator.Current);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个LINQ之一:

if (enumerable.Any())
    {
        DoActionOnFirst(enumerable.First());

        foreach (var item in enumerable.Skip(1))
            DoActionOnOther(item);
    }
Run Code Online (Sandbox Code Playgroud)

编辑:如果项目上的操作具有可分配的签名Func<TItem, TResult>,您可以执行以下操作:

enumerable.Select((item, index) => index == 0 ? GetResultFromFirstItem(item) : GetResultFromOtherItem(item));
Run Code Online (Sandbox Code Playgroud)

  • @Babar使用此解决方案,无需在每次迭代时评估变量 (6认同)
  • 虽然这在技术上满足了这些要求,但与使用"第一个"标志表示其他人已发布的标记相比,它的可读性要低得多. (3认同)
  • @Paul:效率更高,我不明白为什么它的可读性明显降低. (3认同)

Ham*_*mza 6

bool first = true;
foreach(var foo in bar)
{
  if (first)
  {
    // do something to your first item
    first = false;
  }
  // do something else to the rest
}
Run Code Online (Sandbox Code Playgroud)

  • 这是 StackOverflow 获得专利的简单问题竞赛:) (3认同)

Ari*_*niz 5

在我看来这是最简单的方法

foreach (var item in list)
{
    if((list.IndexOf(item) == 0)
    {
        // first
    }
    // others
}
Run Code Online (Sandbox Code Playgroud)

  • 这可能是最简单的方法,但它非常昂贵。如果列表是任意的“IEnumerable”,则复杂度在 O(n) 之内,这是每次迭代中要执行的大量开销。 (6认同)