Это - там какая-либо реализация LRU IDictionary?

Я использую несколько функций из библиотеки «datetime». Вы можете весело написать их: date (y, m, d), timedelta (days = 7), day, weekday (), '{:% Y% m% d}'. Format (day), strptime (input , "% Y% m% d"), strftime (datetime, "% a% x"). Хорошая идея - создать класс для даты и избавиться от всех преобразований формата. Таким образом, только дата (y, m, d), timedelta (days = 7), day, weekday () будут оставлены для тренировки.

import datetime
from datetime import date, timedelta


def day2string(day):
    return '{:%Y%m%d}'.format(day)


def year_holidays(year):
    holidays = [
        ["New Year's Day", 1, 1],  # Fixed: January 1
        ["Birthday of Martin Luther King, Jr.", 1, 0, 0, 3],  # Floating
        ["Washington's Birthday", 2, 0, 0, 3],  # Third Monday in February
        ["Memorial Day", 5, 0, 0, 5],  # Last Monday
        ["Independence Day", 7, 4],
        ["Labor Day", 9, 0, 0, 1],
        ["Columbus Day", 10, 0, 0, 2],
        ["Veterans Day", 11, 11],
        ["Thanksgiving Day", 11, 0, 3, 4],
        ["Christmas Day", 12, 25]
    ]
    year_list = []
    for h in holidays:
        if h[2] > 0:
            day = date(year, h[1], h[2])  # Fixed day
        else:
            day = date(year, h[1], 1)  # Floating day
            while h[3] != day.weekday():  # Advance to match the weekday
                day += timedelta(days=1)
            count = 1
            while count != h[4]:  # Match the repetition of this day
                next_week = day + timedelta(days=7)
                if next_week.month == day.month:
                    day = next_week
                count += 1
        year_list.append(day2string(day))
    return year_list  # return the holidays as list of strings


def str2datetime(string):
    return datetime.datetime.strptime(string, '%Y%m%d')


def next_working_day(string):
    day = str2datetime(string)
    day += timedelta(days=1)
    while True:
        while day.weekday() >= 5:
            day += timedelta(days=1)
        holidays_list = year_holidays(day.year)
        for str_day in holidays_list:
            s2 = day2string(day)
            if str_day == s2:
                day += timedelta(days=1)
                break  # for
        if day.weekday() < 5:
            break  # while True
    return day2string(day)


if __name__ == '__main__':
    dates = [
        ['20190308', '20190311', '20190313'],
        ['20190309', '20190311', '20190313'],
        ['20190310', '20190311', '20190313'],
        ['20190311', '20190312', '20190314'],
        ['20190329', '20190401', '20190403'],
        ['20181231', '20190102', '20190104'],
        ['20190118', '20190122', '20190124'],
        ['20190216', '20190219', '20190221'],
        ['20190526', '20190528', '20190530'],
        ['20190703', '20190705', '20190709'],
        ['20190828', '20190829', '20190903'],
        ['20191010', '20191011', '20191016'],
        ['20191108', '20191112', '20191114'],
        ['20191125', '20191126', '20191129'],
        ['20191224', '20191226', '20191230'],
        ['20191227', '20191230', '20200102']]
    print('\n              Today        Next   and   3rd business day')
    for days in dates:
        next_day = next_working_day(days[0])
        third_day = next_working_day(next_working_day(next_day))
        if next_day != days[1] or third_day != days[2]:
            print('*** ERROR *** ', end='')
        else:
            print('              ', end='')

        def f(x): return datetime.datetime.strftime(str2datetime(x), '%a %x')

        print(f(days[0]), f(next_day), f(third_day))

Это должно создать следующий вывод:

          Today        Next   and   3rd business day
          Fri 03/08/19 Mon 03/11/19 Wed 03/13/19
          Sat 03/09/19 Mon 03/11/19 Wed 03/13/19
          Sun 03/10/19 Mon 03/11/19 Wed 03/13/19
          Mon 03/11/19 Tue 03/12/19 Thu 03/14/19
          Fri 03/29/19 Mon 04/01/19 Wed 04/03/19
          Mon 12/31/18 Wed 01/02/19 Fri 01/04/19
          Fri 01/18/19 Tue 01/22/19 Thu 01/24/19
          Sat 02/16/19 Tue 02/19/19 Thu 02/21/19
          Sun 05/26/19 Tue 05/28/19 Thu 05/30/19
          Wed 07/03/19 Fri 07/05/19 Tue 07/09/19
          Wed 08/28/19 Thu 08/29/19 Tue 09/03/19
          Thu 10/10/19 Fri 10/11/19 Wed 10/16/19
          Fri 11/08/19 Tue 11/12/19 Thu 11/14/19
          Mon 11/25/19 Tue 11/26/19 Fri 11/29/19
          Tue 12/24/19 Thu 12/26/19 Mon 12/30/19
          Fri 12/27/19 Mon 12/30/19 Thu 01/02/20
27
задан Antonello 15 April 2009 в 23:55
поделиться

4 ответа

В библиотеках базовых классов нет ничего, что могло бы сделать это.

На свободной стороне, может быть, что-то вроде C5 Будет работать HashedLinkedList .

Если вы готовы платить, возможно, посмотрите этот инструментарий C #. Содержит реализацию.

8
ответ дан Reed Copsey 28 November 2019 в 04:30
поделиться

Я так не считаю. Я, конечно, видел, как раскатанные вручную реализованы несколько раз в различных несвязанных проектах (что более или менее подтверждает это. Если бы был один, наверняка по крайней мере один из проектов использовал бы его).

Это довольно просто реализовать и обычно выполняется путем создания класса, который содержит словарь и список .

Ключи идут в списке (по порядку), а элементы идут в словарь.
Когда вы добавляете новый элемент в коллекцию, функция проверяет длину списка, вытаскивает последний ключ (если он слишком длинный) и затем удаляет ключ и значение из словаря для сопоставления. Не намного больше к этому на самом деле

2
ответ дан Orion Edwards 28 November 2019 в 04:30
поделиться

Блок приложения кэширования EntLib имеет опцию очистки LRU из коробки и может находиться в памяти.

3
ответ дан 28 November 2019 в 04:30
поделиться

Если это приложение asp.net, вы можете использовать класс кеша [1] но вы будете конкурировать за место с другим кешированным материалом, который может быть тем, что вам нужно, а может и не быть.

[1] http://msdn.microsoft.com/en-us/library/system.web.caching.cache .aspx

0
ответ дан 28 November 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: