Linq Lambda表达式-查找与当前日期最接近的星期几(现在) [英] Linq lambda expression - Find the closest day of week to current date (now)

查看:549
本文介绍了Linq Lambda表达式-查找与当前日期最接近的星期几(现在)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如,我有星期一,星期四和星期日作为抽奖日期.用Linq Lambda找到最接近Datetime.Now的dayOfWeek的方法是什么?我可以使用正常功能完成此操作,但是我想知道如何使用Linq Lambda?

I have for example Monday, Thursday and Sunday as draw dates. What would be the way to find the closest dayOfWeek to Datetime.Now with Linq Lambda? I accomplished this with normal function, but I would like to know how to do it with Linq Lambda?

我的方法示例:

    public static DateTime GetSoonestDrawDate(this DateTime from, IEnumerable<LotteryDrawDate> drawDates)
    {

        int hour = 0;
        int minute = 0;

        bool todayDrawOnly = true;

        int difference = 7;
        int tempDifference = 0;

        int todayDay = (int)from.DayOfWeek;
        int drawCutOffDay = 0;

        if (todayDay == 0)
        {
            todayDay = 7;
        }

        var tempCutOffTime = new TimeSpan(23, 59, 59);

        foreach (var drawDate in drawDates)
        {
            // DayId is DayOfWeek
            drawCutOffDay = drawDate.DayId;

            if (drawCutOffDay < todayDay)
            {
                drawCutOffDay += 7;
            }

            tempDifference = drawCutOffDay - todayDay;

            var cutOffTime = new TimeSpan();
            cutOffTime = TimeSpan.Parse(drawDate.CutOffTime);

            if ((difference > tempDifference) || difference == 0)
            {
                // draw date is not today
                if (tempDifference != 0)
                {
                    difference = tempDifference;
                    hour = cutOffTime.Hours;
                    minute = cutOffTime.Minutes;
                    todayDrawOnly = false;
                }
                // same day, cutOffTime still available
                if ((tempDifference == 0 && cutOffTime > from.TimeOfDay))
                {
                    // we use tempCutOffTime to compare newest cutOffTime in case we have more cutOffTimes on the same day
                    // in that case we have to select the soonest cutOffTime of the day
                    if (cutOffTime < tempCutOffTime)
                    {
                        difference = tempDifference;
                        hour = cutOffTime.Hours;
                        minute = cutOffTime.Minutes;
                        todayDrawOnly = true;
                        tempCutOffTime = cutOffTime;
                    }
                }
                // same day selected only, but cutOffTime passed, so we add another week only in case there is only one draw date and draw date is on the same day
                else if (tempDifference == 0 && cutOffTime < from.TimeOfDay && todayDrawOnly == true)
                {
                    if (cutOffTime < tempCutOffTime)
                    {
                        difference = 7;
                        hour = cutOffTime.Hours;
                        minute = cutOffTime.Minutes;
                        todayDrawOnly = true;
                        tempCutOffTime = cutOffTime;
                    }
                }
            }
        }

        from = from.AddDays(difference);

        DateTime soonest = new DateTime(from.Year, from.Month, from.Day, hour, minute, 0);

        return soonest;
    }

推荐答案

由于您没有显示LotteryDrawDate的样子,因此我仅使用DayOfWeek准备了一个小示例.您必须扩展它才能自己查看时间部分.

Because you didn't show how LotteryDrawDate looks like, I prepared a little sample using DayOfWeek only. You have to extend that to look at time part by your own.

public static DateTime GetSoonestDrawDate(this DateTime from, IEnumerable<DayOfWeek> drawDates)
{
    var realDrawDates = drawDates.SelectMany(x => new[] { (int)x, (int)x + 7 }).OrderBy(x => x);
    var difference = realDrawDates.SkipWhile(x => x < (int)from.DayOfWeek).First() - (int)from.DayOfWeek;
    return from.AddDays(difference);
}

少量测试代码:

var drawDates = new[] { DayOfWeek.Monday, DayOfWeek.Wednesday, DayOfWeek.Saturday };

for (int i = 0; i < 15; i++)
{
    var from = DateTime.Now.AddDays(i);
    Console.WriteLine("{0} - {1}", from.ToShortDateString(), GetSoonestDrawDate(from, drawDates).ToShortDateString());
}

打印(来自-下一页):

11/18/2013 - 11/18/2013
11/19/2013 - 11/20/2013
11/20/2013 - 11/20/2013
11/21/2013 - 11/23/2013
11/22/2013 - 11/23/2013
11/23/2013 - 11/23/2013
11/24/2013 - 11/25/2013
11/25/2013 - 11/25/2013
11/26/2013 - 11/27/2013
11/27/2013 - 11/27/2013
11/28/2013 - 11/30/2013
11/29/2013 - 11/30/2013
11/30/2013 - 11/30/2013
12/1/2013 - 12/2/2013
12/2/2013 - 12/2/2013

这篇关于Linq Lambda表达式-查找与当前日期最接近的星期几(现在)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆