Другой подход заключается в том, чтобы признать, что «некрасивая часть» должна быть где-то реализована, и предоставить абстракцию, которая скрывает «некрасивую часть», чтобы вам не приходилось повторять ее в нескольких местах и можно было сосредоточиться на конкретном алгоритме , Это можно сделать с помощью лямбда-выражений C # (или с помощью анонимных делегатов C # 2.0, если вы ограничены .NET 2.0):
void ForEachWithFirst<T>(IEnumerable<T> en,
Action<T> firstRun, Action<T> nextRun) {
bool first = true;
foreach(var e in en) {
if (first) { first = false; firstRun(e); } else nextRun(e);
}
}
Теперь вы можете использовать этот метод многократного использования для реализации вашего алгоритма следующим образом:
ForEachWithFirst(websitePages,
(wp => sb.AppendLine(String.Format("<li class=\"first\">" +
"<a href=\"{0}\">{1}</a></li>", wp.GetFileName(), wp.Title)))
(wp => sb.AppendLine(String.Format("<li>" +
"<a href=\"{0}\">{1}</a></li>", wp.GetFileName(), wp.Title))) );
Вы можете создать абстракцию по-разному в зависимости от точного повторяющегося шаблона. Хорошо, что благодаря лямбда-выражению структура абстракции полностью зависит от вас.