Можно ли улучшить приведенную ниже функцию? (C # 3.0) - PullRequest
0 голосов
/ 16 июня 2010

У меня есть следующая функция

public static List<DateTime> GetOnlyFridays(DateTime endDate, int weeks, bool isIncludeBaseDate)
{
    //Get only the fridays from the date range
    List<DateTime> dtlist = new List<DateTime>();

    List<DateTime> tempDtlist = (from dtFridays in GetDates(endDate, weeks)
                                 where dtFridays.DayOfWeek == DayOfWeek.Friday
                                 select dtFridays).ToList();

    if (isIncludeBaseDate)
    {
        dtlist = tempDtlist.Skip(1).ToList();
        dtlist.Add(endDate);
    }
    else
    {
        dtlist = tempDtlist;
    }

    return dtlist;
}

В основном я делаю получение списка дат с помощью функции GetDates , а затем в зависимости от isIncludeBaseDate bool value (если верно), пропускаяпоследняя дата и добавление Base Date

Работает нормально, но можно ли улучшить эту программу?

Я использую C # 3.0 и Framework 3.5

Спасибо

Ответы [ 3 ]

6 голосов
/ 16 июня 2010

Вы делаете слишком много временных преобразований списков; Вы можете сохранить всю работу как запрос до самого конца, так что она будет оценена только один раз

public static List<DateTime> GetOnlyFridays(DateTime endDate, int weeks, bool isIncludeBaseDate)
{
    var fridays = GetDates(endDate, weeks)
                    .Where(d => d.DayOfWeek == DayOfWeek.Friday);
    if (isIncludeBaseDate)
    {
        fridays = fridays.Skip(1)
                         .Concat(new []{endDate});
    }
    return fridays.ToList();
}
2 голосов
/ 16 июня 2010

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

public static IEnumerable<DateTime> GetOnlyFridays(DateTime endDate, int weeks, bool isIncludeBaseDate)
{
    var fridays = from dtFridays in GetDates(endDate, weeks)
                  where dtFridays.DayOfWeek == DayOfWeek.Friday
                  select dtFridays;

    if (isIncludeBaseDate)
    {
        return fridays.Skip(1);
    }
    return fridays;
}
0 голосов
/ 16 июня 2010

Я бы также попытался найти ближайшую пятницу в 'endDate' или раньше, а затем в течение многих недель делать DateTime.AddDays (7);и, конечно, принять во внимание isIncludeBaseDate.

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