Менее подробный способ обработки первого прохода через foreach? - PullRequest
22 голосов
/ 22 февраля 2010

Я часто обнаруживаю, что делаю следующее беспорядок счетчика индексов в цикле foreach, чтобы выяснить, нахожусь ли я на первом элементе или нет. Есть ли более элегантный способ сделать это в C # , что-то вроде if(this.foreach.Pass == 1) и т. Д .?

int index = 0;
foreach (var websitePage in websitePages) {
    if(index == 0)
        classAttributePart = " class=\"first\"";
    sb.AppendLine(String.Format("<li" + classAttributePart + ">" + 
        "<a href=\"{0}\">{1}</a></li>", 
        websitePage.GetFileName(), websitePage.Title));
    index++;
}

Ответы [ 12 ]

0 голосов
/ 22 февраля 2010
public static class ExtenstionMethods
{
    public static IEnumerable<KeyValuePair<Int32, T>> Indexed<T>(this IEnumerable<T> collection)
    {
        Int32 index = 0;

        foreach (var value in collection)
        {
            yield return new KeyValuePair<Int32, T>(index, value);
            ++index;
        }
    }
}

foreach (var iter in websitePages.Indexed())
{
    var websitePage = iter.Value;
    if(iter.Key == 0) classAttributePart = " class=\"first\"";
    sb.AppendLine(String.Format("<li" + classAttributePart + "><a href=\"{0}\">{1}</a></li>", websitePage.GetFileName(), websitePage.Title));
}
0 голосов
/ 22 февраля 2010

Как любит говорить мой папа: «Используйте правильный инструмент для работы».

В этом случае посмотрите, что нужно сделать вашему циклу.

  • Если это что-то, что можно сделать вне цикла, переместите его, и использование foreach в порядке.
  • Если вам нужно обработать сложную комбинацию случаев, то вы можете рассмотреть возможность использования другого шаблона (например: шаблон состояния или того, что наиболее подходит) для вещей, которые вы хотите сделать внутри цикла, и в этом случае вы выбираете ту конструкцию цикла, которая наиболее целесообразна в то время.
  • Если ваш цикл зависит от возможности извлечения индекса итерации для его передачи в другое место, то, возможно, цикл for может быть лучшим выбором.

В противном случае, чтобы ответить на ваш вопрос, не представляется простым не многословным средством определения индекса элемента списка при доступе к нему в цикле foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...