Я хотел довести этот вызов до сведения сообщества stackoverflow. Оригинальная проблема и ответы здесь. Кстати, если вы раньше не следовали этому, вы должны попытаться прочитать блог Эрика, это чистая мудрость.
Резюме:
Напишите функцию, которая принимает ненулевой IEnumerable и возвращает строку со следующими характеристиками:
- Если последовательность пуста, результирующая строка "{}".
- Если последовательность представляет собой отдельный элемент "ABC" , тогда результирующая строка будет "{ABC}".
- Если последовательность представляет собой последовательность двух элементов "ABC" , "DEF", тогда результирующая строка "{ABC и DEF}".
- Если последовательность имеет более двух элементов, например, "ABC" , "DEF", "G", "H", тогда результирующая строка "{ABC, DEF, G и H}". (Примечание: нет Оксфордской запятой!)
Как вы можете видеть даже наш собственный Джон Скит (да, хорошо известно, что он может быть в двух местах одновременно) опубликовал решение но его (IMHO) не самый изящный, хотя, вероятно, вы не можете победить его производительность.
Как вы думаете? Там довольно хорошие варианты. Мне очень нравится одно из решений, которое включает в себя методы выбора и совокупности (от Fernando Nicolet). Linq очень эффективен и посвящает некоторое время таким сложным задачам, чтобы вы многому научились. Я немного перекрутил его, чтобы он был более реалистичным и понятным (используя Count и избегая Reverse):
public static string CommaQuibbling(IEnumerable<string> items)
{
int last = items.Count() - 1;
Func<int, string> getSeparator = (i) => i == 0 ? string.Empty : (i == last ? " and " : ", ");
string answer = string.Empty;
return "{" + items.Select((s, i) => new { Index = i, Value = s })
.Aggregate(answer, (s, a) => s + getSeparator(a.Index) + a.Value) + "}";
}