[править]
Я уверен, что есть более чистый способ сделать это, но вот что у меня есть. Простая группировка облегчила бы, если бы не ограничения по времени. Я постараюсь придумать другую версию.
var amTimes = times.Where(to => to.time.Hour < 12)
.Select((to, i) => new
{
to.isMatinee,
repr = i == 0 ? to.time.ToString("h:mmtt")
: to.time.ToString("h:mm")
});
var pmTimes = times.Where(to => to.time.Hour >= 12)
.Select((to, i) => new
{
to.isMatinee,
repr = i == 0 ? to.time.ToString("h:mmtt")
: to.time.ToString("h:mm")
});
var stimes = amTimes.Concat(pmTimes);
var mats = String.Join(", ", stimes.Where(t => t.isMatinee).Select(t => t.repr));
var nonmats = String.Join(", ", stimes.Where(t => !t.isMatinee).Select(t => t.repr));
var output = string.Format("({0}), {1}", mats, nonmats);
[edit2]
Хорошо, так что это, скорее всего, тот ответ, который искал интервьюер.
var output = String.Join(", ",
times.Select(to => new
{
prefix = to == times.First(t => t.isMatinee) ? "(" : "",
time = to.time,
fmt = to.time.Hour < 12
? (to == times.First(t => t.time.Hour < 12) ? "h:mmtt" : "h:mm")
: (to == times.First(t => t.time.Hour >= 12) ? "h:mmtt" : "h:mm"),
suffix = to == times.Last(t => t.isMatinee) ? ")" : "",
})
.Select(x => String.Format("{0}{1}{2}", x.prefix, x.time.ToString(x.fmt), x.suffix)));
Обычно, когда я пишу выражения LINQ, я всегда стараюсь учитывать производительность. Поскольку производительность здесь не является фактором. Это должно быть легче всего писать и следовать (но с ужасной производительностью).
Подход, учитывайте время, способ его форматирования и любой префикс (открытый символ) или суффикс (закрывающий элемент) при печати Пока группировка isMatinee
является непрерывной (что я всегда предполагал) с отсортированным временем, это всегда должно работать.
Он имеет префикс только в том случае, если это первый раз в утреннике. Суффикс, если это последний раз, когда утренник. Он должен быть отформатирован с AM / PM, если он впервые в соответствующей группе. Это должно быть очень легко понять.
Если бы речь шла только о группировке утренников, я бы, наверное, сделал это:
var output = String.Join(", ",
times.GroupBy(to => to.isMatinee, to => to.time.ToString("h:mm"))
.Select(g => g.Key ? "(" + String.Join(", ", g) + ")"
: String.Join(", ", g)));