有没有办法可以确定我在foreach循环中位于哪一行?

时间:2018-10-03 10:14:26

标签: c# .net foreach

我有此代码:

foreach (var row in App.cardSetWithWordCounts)
{
   details.Children.Add(new SeparatorTemplate());
   // do some tasks for every row 
   // in this part of the loop ...
}

我不想添加SeparatorTemplate但我不想在foreach的第一次运行中执行其他任务。有人对我该如何做有建议吗?

我想执行foreach中的其余代码,但不想在第一次添加模板的行中执行。

5 个答案:

答案 0 :(得分:11)

如果要跳过第一行,可以使用Skip

foreach (var row in App.cardSetWithWordCounts.Skip(1))

如果您想知道确切的行号,请使用Select重载:

foreach (var x in App.cardSetWithWordCounts.Select((r, i) => new { Row = r, Index = i })
{
    // use x.Row and x.Index
}

答案 1 :(得分:2)

最简单的方法是:

bool isFirstRun = true;
foreach (var row in App.cardSetWithWordCounts)
{
    if(isFirstRun)
        isFirstRun = false;
    else
        details.Children.Add(new SeparatorTemplate());

    // do some tasks for every row 
    // in this part of the loop ...    
}

答案 2 :(得分:1)

您可以为此目的使用Skip方法:

foreach (var row in App.cardSetWithWordCounts.Skip(1))

更新:

foreach (var row in App.cardSetWithWordCounts.Select((c, index) => new { Row = c, Index = index })
{
    if(row.Index != 0)
}

请不要忘记将以下行添加到using指令中:

using System.Linq;

答案 3 :(得分:1)

var firstRow = true;

foreach(var row in App.cardSetWithWordCounts)
{
    if(firstRow) 
    {
        firstRow = false;
    }
    else
    {
        // rest of the code here
    }   
}

答案 4 :(得分:1)

您可以尝试创建一种扩展方法。

Action的第二个参数是迭代器索引。

public static class ExtenstionArray
{
    public static void ForEach<T>(this IEnumerable<T> sequence, Action< T, int> action)
    {
        int i = 0;
        foreach (T item in sequence)
        {
            action(item,i);
            i++;
        }
    }
}

然后像这样使用。

App.cardSetWithWordCounts.ForEach((i, idx)=>{
    if(idx == 0){
        details.Children.Add(new SeparatorTemplate());
    }
    // other logic
});

c# online