Хороший способ написать цикл, который имеет специальную логику для первого элемента в коллекции - PullRequest
12 голосов
/ 08 декабря 2010

Часто мне приходится кодировать цикл, который в специальном случае должен содержать первый элемент в коллекции, код никогда не кажется ясным, как и должно быть.лучший способ кодирования этих циклов?

// this is more code to read then I would like for such a common concept
// and it is to easy to forget to update "firstItem"
foreach(x in yyy)
{
  if (firstItem)
  {
     firstItem = false;
     // other code when first item
  }
  // normal processing code
}

// this code is even harder to understand
if (yyy.Length > 0)
{
   //Process first item;
   For(int I = 1; I <yyy.Length; i++)
   {  
      // process the other items.
   }
}

Ответы [ 11 ]

0 голосов
/ 08 декабря 2010

Оба эти алгоритма являются совершенно приемлемыми алгоритмами для обработки первого элемента по-разному, и на самом деле нет другого способа сделать это.Если этот шаблон повторяется много раз, вы можете скрыть его за перегрузкой ForEach ():

public static void ForEach<T>(this IEnumerable<T> elements, Action<T> firstElementAction, Action<T> standardAction)
{
    var firstItem = true;
    foreach(T element in elements)
    {
        if(firstItem)
        {
            firstItem = false;
            firstElementAction(element)
        }
        else
            standardAction(element)
    }
}

...

//usage
yyy.ForEach(t=>(other code when first item), t=>(normal processing code));

Linq делает его немного чище:

PerformActionOnFirstElement(yyy.FirstOrDefault());
yyy.Skip(1).ForEach(x=>(normal processing code));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...