Останні 6 п'ятниць з сьогоднішнього дня

Це досить специфічний, мені потрібні дати останніх 6 п'ятниць у C# .NET. Наразі ми виконуємо це завдання, використовуючи базу даних SQL з повною таблицею дат п'ятниці у році.

Це має два питання:

1) Здається, непотрібний запит до бази даних, коли я впевнений, що C# може це зробити.

2) Я повинен пам'ятати наприкінці року, щоб додати в наступному році.

Я дивився навколо сітки та я переконуюсь theres пошта десь thats показ мені відповідь ясно, але я не можу здаватися знайти це!

Я сподіваюся, хтось може допомогти мені з кодом для цього питання.

Велике спасибі заздалегідь!

0
Це являє собою 6 п'ятницю перед сьогодні та якщо сьогодні п'ятниця тоді що буде один з 6.
додано Автор JammoD, джерело
Це являє собою 6 п'ятницю перед сьогодні та якщо сьогодні п'ятниця тоді що буде один з 6.
додано Автор JammoD, джерело
Може бути, я просто вас неправильно зрозумів, але вам потрібні "найближчі п'ятниці до сьогодні" або "найближчі 6 п'ятниць після сьогодні? Також, ми ігноруємо Сьогодні, якщо це зараз п'ятниця?
додано Автор Ilya Ivanov, джерело
Може бути, я просто вас неправильно зрозумів, але вам потрібні "найближчі п'ятниці до сьогодні" або "найближчі 6 п'ятниць після сьогодні? Також, ми ігноруємо Сьогодні, якщо це зараз п'ятниця?
додано Автор Ilya Ivanov, джерело
Клас календаря робить це дуже добре. en-us/library/& hellip;
додано Автор C4stor, джерело

7 Відповіді

Основна ідея полягає в тому, щоб вибрати першу п'ятницю до сьогоднішнього дня, а крок за один тиждень:

var now = DateTime.Now;
DateTime nearestFridayBeforeToday;

if(now.DayOfWeek != DayOfWeek.Friday)
{
    nearestFridayBeforeToday = now.AddDays(DayOfWeek.Friday - now.DayOfWeek) //returns first friday after today
                                  .AddDays(-7); //so we need to subtract one week
}
else
{
    nearestFridayBeforeToday = now;
}

var sixFridaysBeforeNow = Enumerable.Range(0, 6)
                                    .Select(n => nearestFridayBeforeToday.AddDays(-7 * n));

//print results 
var r = sixFridaysBeforeNow.Select(d => string.Format("{0} : {1}", d, d.DayOfWeek));
Console.WriteLine (string.Join(Environment.NewLine, r));

відбитки:

6/21/2013 3:37:52 PM : Friday
6/14/2013 3:37:52 PM : Friday
6/7/2013 3:37:52 PM : Friday
5/31/2013 3:37:52 PM : Friday
5/24/2013 3:37:52 PM : Friday
5/17/2013 3:37:52 PM : Friday
5
додано
Якщо сьогодні Субота , ви віднімете тиждень і пропустіть вчора, який повинен був бути в списку.
додано Автор Matt Johnson, джерело
Це не матиме хороших результатів, якщо сьогодні п'ятниця або субота.
додано Автор Matt Johnson, джерело
Майже, але не зовсім там ... Перевірте логіку, коли потрібно відняти тиждень. Порівняйте мою відповідь, якщо вам потрібна підказка. :-)
додано Автор Matt Johnson, джерело
@MattJohnson чому? нам потрібно лише відняти, коли зараз це п'ятниця. Якщо це - ми повинні починати з сьогоднішнього дня і вважати шість тижнів
додано Автор Ilya Ivanov, джерело
@MattJohnson спасибі, виправлено
додано Автор Ilya Ivanov, джерело

У структурі DateTime є властивість, яка називається < код> DayOfWeek . Це перелік, який говорить вам, що день тижня відповідає тому екземпляру DateTime .

Отже, ви можете написати такий код:

List sixFridays = new List();
DateTime foo = DateTime.Today;

while (sixFridays.Count < 6) {
    if (foo.DayOfWeek == DayOfWeek.Friday) sixFridays.Add(foo);
    foo = foo.AddDays(-1);
}

Це дасть вам шість п'ятниць до сьогоднішнього дня. Якщо ви хочете, щоб шість п'ятниць після сьогоднішнього дня, просто додайте 1 день замість -1 у цикл.

@Damien_The_Unbeliever запропонував менш грубий примусовий підхід. Ось це:

List sixFridays = new List();
DateTime foo = DateTime.Today;

while (foo.DayOfWeek != DayOfWeek.Friday) {
    foo = foo.AddDays(-1);
}

for (int i = 0; i < 6; foo.AddDays(-7)) {
    sixFridays.Add(foo);
    i++;//I don't remember if you could place this together with foo.AddDays(-7) in the last part of the command.
}

Edited since the OP said he wants to include the current day in case it's a friday too, also it's six fridays before today.

3
додано
Чи не здається вам, що після того, як ви визначилися в першу п'ятницю, можливо, з'явиться можливість, можливо, обчислити всі інші п'ятниці відразу, а не зациклюватися?
додано Автор Damien_The_Unbeliever, джерело
@Damien_The_Unbeliever yep. Існує навіть така відповідь, яку я проголосував. Це просто 20 секундне рішення. Завжди можна вдосконалити. Якби це була більш складна проблема, я, звичайно, не використовував брутального рішення, такого як той, який я пропоную.
додано Автор Renan, джерело
Бийте мене! Видалені мої і проголошені ваші.
додано Автор Mike B, джерело

У структурі DateTime є властивість, яка називається < код> DayOfWeek . Це перелік, який говорить вам, що день тижня відповідає тому екземпляру DateTime .

Отже, ви можете написати такий код:

List sixFridays = new List();
DateTime foo = DateTime.Today;

while (sixFridays.Count < 6) {
    if (foo.DayOfWeek == DayOfWeek.Friday) sixFridays.Add(foo);
    foo = foo.AddDays(-1);
}

Це дасть вам шість п'ятниць до сьогоднішнього дня. Якщо ви хочете, щоб шість п'ятниць після сьогоднішнього дня, просто додайте 1 день замість -1 у цикл.

@Damien_The_Unbeliever запропонував менш грубий примусовий підхід. Ось це:

List sixFridays = new List();
DateTime foo = DateTime.Today;

while (foo.DayOfWeek != DayOfWeek.Friday) {
    foo = foo.AddDays(-1);
}

for (int i = 0; i < 6; foo.AddDays(-7)) {
    sixFridays.Add(foo);
    i++;//I don't remember if you could place this together with foo.AddDays(-7) in the last part of the command.
}

Edited since the OP said he wants to include the current day in case it's a friday too, also it's six fridays before today.

3
додано
Чи не здається вам, що після того, як ви визначилися в першу п'ятницю, можливо, з'явиться можливість, можливо, обчислити всі інші п'ятниці відразу, а не зациклюватися?
додано Автор Damien_The_Unbeliever, джерело
@Damien_The_Unbeliever yep. Існує навіть така відповідь, яку я проголосував. Це просто 20 секундне рішення. Завжди можна вдосконалити. Якби це була більш складна проблема, я, звичайно, не використовував брутального рішення, такого як той, який я пропоную.
додано Автор Renan, джерело
Бийте мене! Видалені мої і проголошені ваші.
додано Автор Mike B, джерело

Ось метод розширення, який можна використовувати.

public static IEnumerable Last(this DayOfWeek dow, int count)
{
    var today = DateTime.Today;
    var adjustment = today.DayOfWeek - dow + (dow > today.DayOfWeek ? 7 : 0);
    return Enumerable.Range(0, count)
                     .Select(x => today.AddDays(x * -7 - adjustment));
}

Зателефонуйте йому так:

var last6Fridays = DayOfWeek.Friday.Last(6);

Наприклад:

var last6Fridays = DayOfWeek.Friday.Last(6);
var formatted = string.Join(Environment.NewLine,
                            last6Fridays.Select(x => x.ToLongDateString()));
Console.WriteLine(formatted);

Вивід:

21 червня 2013 р.

  П'ятниця, 14 червня 2013
  П'ятниця, 7 червня 2013
  П'ятниця, 31 травня 2013
  П'ятниця, 24 травня 2013
  П'ятниця, 17 травня 2013 року

2
додано
+1, приємна відповідь
додано Автор Ilya Ivanov, джерело

Ось метод розширення, який можна використовувати.

public static IEnumerable Last(this DayOfWeek dow, int count)
{
    var today = DateTime.Today;
    var adjustment = today.DayOfWeek - dow + (dow > today.DayOfWeek ? 7 : 0);
    return Enumerable.Range(0, count)
                     .Select(x => today.AddDays(x * -7 - adjustment));
}

Зателефонуйте йому так:

var last6Fridays = DayOfWeek.Friday.Last(6);

Наприклад:

var last6Fridays = DayOfWeek.Friday.Last(6);
var formatted = string.Join(Environment.NewLine,
                            last6Fridays.Select(x => x.ToLongDateString()));
Console.WriteLine(formatted);

Вивід:

21 червня 2013 р.

  П'ятниця, 14 червня 2013
  П'ятниця, 7 червня 2013
  П'ятниця, 31 травня 2013
  П'ятниця, 24 травня 2013
  П'ятниця, 17 травня 2013 року

2
додано
+1, приємна відповідь
додано Автор Ilya Ivanov, джерело

Ви також можете спробувати це

 private List GetLastFridays()
 {

        List lstLastFridays = new List();
        TimeSpan oTimeSpan = new TimeSpan(((int)DateTime.Now.DayOfWeek + 2), 0, 0, 0, 0);
        DateTime dt = DateTime.Now.Subtract(oTimeSpan);

        lstLastFridays.Add(dt);

        for (int count = 0; count < 6; count++)
        {
            dt = dt.Subtract(new TimeSpan(7, 0, 0, 0, 0));
            lstLastFridays.Add(dt);
        }

        return lstLastFridays;

 }
1
додано
Можна також використовувати DateTime.AddDays . Я думаю, що це більш інтуїтивно.
додано Автор Renan, джерело
ігноруючи інші подробиці, я хочу запропонувати використовувати TimeSpan.FromDays (7) замість нового коду часу (7, 0, 0, 0, 0) більш читабельний.
додано Автор Ilya Ivanov, джерело

Ви також можете спробувати це

 private List GetLastFridays()
 {

        List lstLastFridays = new List();
        TimeSpan oTimeSpan = new TimeSpan(((int)DateTime.Now.DayOfWeek + 2), 0, 0, 0, 0);
        DateTime dt = DateTime.Now.Subtract(oTimeSpan);

        lstLastFridays.Add(dt);

        for (int count = 0; count < 6; count++)
        {
            dt = dt.Subtract(new TimeSpan(7, 0, 0, 0, 0));
            lstLastFridays.Add(dt);
        }

        return lstLastFridays;

 }
1
додано
Можна також використовувати DateTime.AddDays . Я думаю, що це більш інтуїтивно.
додано Автор Renan, джерело
ігноруючи інші подробиці, я хочу запропонувати використовувати TimeSpan.FromDays (7) замість нового коду часу (7, 0, 0, 0, 0) більш читабельний.
додано Автор Ilya Ivanov, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug