Есть ли способ, которым я могу определить, в какой строке я нахожусь в цикле foreach? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть этот код:

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 голосов
/ 03 октября 2018

Самый простой будет:

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 ...    
}
0 голосов
/ 03 октября 2018

Вы можете попытаться создать метод Extention.

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

0 голосов
/ 03 октября 2018

Вы можете использовать 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;
0 голосов
/ 03 октября 2018
var firstRow = true;

foreach(var row in App.cardSetWithWordCounts)
{
    if(firstRow) 
    {
        firstRow = false;
    }
    else
    {
        // rest of the code here
    }   
}
0 голосов
/ 03 октября 2018

Если вы хотите пропустить первую строку, вы можете использовать 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...