C# 在c中使用委托计算工作日数的最简单方法?

C# 在c中使用委托计算工作日数的最简单方法?,c#,delegates,C#,Delegates,下面是我的简单代码,我使用委托和lambda表达式来获取给定开始日期和结束日期的工作日 我的朋友说他可以用一行代码编写整个程序。我该怎么做 public delegate void GetWorkingDays(DateTime x,DateTime y); class Program { static void Main(string[] args) { var dt1 = new DateTime(2012, 10, 3); var dt2 =

下面是我的简单代码,我使用委托和lambda表达式来获取给定开始日期和结束日期的工作日


我的朋友说他可以用一行代码编写整个程序。我该怎么做

public delegate void GetWorkingDays(DateTime x,DateTime y);
class Program
{
    static void Main(string[] args)
    {
        var dt1 = new DateTime(2012, 10, 3);
        var dt2 = new DateTime(2013, 10, 3);
        System.Collections.ArrayList l = new ArrayList();
        GetWorkingDays d = (d1, d2) =>
        {
            while (d1.Date < d2.Date) 
            {
                if(d1.DayOfWeek == DayOfWeek.Saturday)
                {
                    d1 = d1.AddDays(2);
                    Console.WriteLine();
                }
                else
                {
                   Console.Write(d1.Day + "  ");
                    d1 = d1.AddDays(1);
                }
            } 
        };
        d(dt1, dt2);
    }
};

我不知道如何在一行中完成,因为定义委托至少需要一行,调用delagate至少需要一行。但这是一行获取工作日的天数并进行计数的代码

GetWorkingDays d = (dateFrom, dateTo) =>
        Enumerable
            .Range(0, (int)dateTo.Subtract(dateFrom).TotalDays + 1)
            .Select(x => dateFrom.AddDays(x))
            .Count(x => x.DayOfWeek != DayOfWeek.Saturday && x.DayOfWeek != DayOfWeek.Sunday);
Console.Writeline("Number of Weekdays is {0}",d(dateFrom, dateTo));


我不知道如何在一行中完成,因为定义委托至少需要一行,调用delagate至少需要一行。但这是一行获取工作日的天数并进行计数的代码

GetWorkingDays d = (dateFrom, dateTo) =>
        Enumerable
            .Range(0, (int)dateTo.Subtract(dateFrom).TotalDays + 1)
            .Select(x => dateFrom.AddDays(x))
            .Count(x => x.DayOfWeek != DayOfWeek.Saturday && x.DayOfWeek != DayOfWeek.Sunday);
Console.Writeline("Number of Weekdays is {0}",d(dateFrom, dateTo));


虽然这可能无法回答您的问题,但告诉您您根本不应该这样做非常重要,原因有二

编写可读的代码是非常重要的,并且您现有的代码已经尽可能好了。复杂的单行程序不仅使其可读性降低,而且使调试更加困难。整体维护是一场噩梦

您的目标是带来副作用,而不是在计算后返回值。换句话说,您的代理返回void。Linq风格的查询在这里不是一个好方法

以及两项建议:

我在你的代码中看到了ArrayList。从.NET2开始使用它就是犯罪。如果你把它改成一个列表,你会被称为英雄。如果你的朋友很聪明,他应该帮助你做这些基本的事情,而不是学究

以Get开头的名称。。。对于返回nothing void的方法或委托来说,这不是一个好名字。我会叫它WorkingDayStrinter左右

就为了这个,你的答案应该是这样的:

WorkingDaysPrinter p = (d1, d2) => Enumerable.Range(0, d2.Subtract(d1).Days)
                                             .Select(x => d1.AddDays(x))
                                             .Where((x, i) => i == 0 || x.DayOfWeek != DayOfWeek.Sunday)
                                             .ToList()
                                             .ForEach(x =>
                                              {
                                                  if (x.DayOfWeek == DayOfWeek.Saturday)
                                                      Console.WriteLine();
                                                  else
                                                      Console.Write(x.Day + " ");
                                              });
public delegate IEnumerable<DateTime> WorkingDaysGetter(DateTime x, DateTime y);

WorkingDaysGetter g = (d1, d2) => Enumerable.Range(0, d2.Subtract(d1).Days)
                                            .Select(x => d1.AddDays(x))
                                            .Where(x => x.DayOfWeek != DayOfWeek.Saturday && x.DayOfWeek != DayOfWeek.Sunday);
foreach (var day in g(dt1, dt2))
{
    Console.Write(x.Day + " ");
}
单独编写查询,然后运行单独的foreach会稍微好一些:

从表面上看,我认为如果您的代表返回一份工作日列表会更好。比如:

WorkingDaysPrinter p = (d1, d2) => Enumerable.Range(0, d2.Subtract(d1).Days)
                                             .Select(x => d1.AddDays(x))
                                             .Where((x, i) => i == 0 || x.DayOfWeek != DayOfWeek.Sunday)
                                             .ToList()
                                             .ForEach(x =>
                                              {
                                                  if (x.DayOfWeek == DayOfWeek.Saturday)
                                                      Console.WriteLine();
                                                  else
                                                      Console.Write(x.Day + " ");
                                              });
public delegate IEnumerable<DateTime> WorkingDaysGetter(DateTime x, DateTime y);

WorkingDaysGetter g = (d1, d2) => Enumerable.Range(0, d2.Subtract(d1).Days)
                                            .Select(x => d1.AddDays(x))
                                            .Where(x => x.DayOfWeek != DayOfWeek.Saturday && x.DayOfWeek != DayOfWeek.Sunday);
foreach (var day in g(dt1, dt2))
{
    Console.Write(x.Day + " ");
}

虽然这可能无法回答您的问题,但告诉您您根本不应该这样做非常重要,原因有二

编写可读的代码是非常重要的,并且您现有的代码已经尽可能好了。复杂的单行程序不仅使其可读性降低,而且使调试更加困难。整体维护是一场噩梦

您的目标是带来副作用,而不是在计算后返回值。换句话说,您的代理返回void。Linq风格的查询在这里不是一个好方法

以及两项建议:

我在你的代码中看到了ArrayList。从.NET2开始使用它就是犯罪。如果你把它改成一个列表,你会被称为英雄。如果你的朋友很聪明,他应该帮助你做这些基本的事情,而不是学究

以Get开头的名称。。。对于返回nothing void的方法或委托来说,这不是一个好名字。我会叫它WorkingDayStrinter左右

就为了这个,你的答案应该是这样的:

WorkingDaysPrinter p = (d1, d2) => Enumerable.Range(0, d2.Subtract(d1).Days)
                                             .Select(x => d1.AddDays(x))
                                             .Where((x, i) => i == 0 || x.DayOfWeek != DayOfWeek.Sunday)
                                             .ToList()
                                             .ForEach(x =>
                                              {
                                                  if (x.DayOfWeek == DayOfWeek.Saturday)
                                                      Console.WriteLine();
                                                  else
                                                      Console.Write(x.Day + " ");
                                              });
public delegate IEnumerable<DateTime> WorkingDaysGetter(DateTime x, DateTime y);

WorkingDaysGetter g = (d1, d2) => Enumerable.Range(0, d2.Subtract(d1).Days)
                                            .Select(x => d1.AddDays(x))
                                            .Where(x => x.DayOfWeek != DayOfWeek.Saturday && x.DayOfWeek != DayOfWeek.Sunday);
foreach (var day in g(dt1, dt2))
{
    Console.Write(x.Day + " ");
}
单独编写查询,然后运行单独的foreach会稍微好一些:

从表面上看,我认为如果您的代表返回一份工作日列表会更好。比如:

WorkingDaysPrinter p = (d1, d2) => Enumerable.Range(0, d2.Subtract(d1).Days)
                                             .Select(x => d1.AddDays(x))
                                             .Where((x, i) => i == 0 || x.DayOfWeek != DayOfWeek.Sunday)
                                             .ToList()
                                             .ForEach(x =>
                                              {
                                                  if (x.DayOfWeek == DayOfWeek.Saturday)
                                                      Console.WriteLine();
                                                  else
                                                      Console.Write(x.Day + " ");
                                              });
public delegate IEnumerable<DateTime> WorkingDaysGetter(DateTime x, DateTime y);

WorkingDaysGetter g = (d1, d2) => Enumerable.Range(0, d2.Subtract(d1).Days)
                                            .Select(x => d1.AddDays(x))
                                            .Where(x => x.DayOfWeek != DayOfWeek.Saturday && x.DayOfWeek != DayOfWeek.Sunday);
foreach (var day in g(dt1, dt2))
{
    Console.Write(x.Day + " ");
}

我的朋友说他可以用一行代码编写整个程序。让他回答你的问题:我是c语言的初学者,所以我把我的问题贴在这里,这样我就可以学到新的东西。首先,你为什么选择用一个代理而不是一个方法?您正在添加不需要的开销。当然,除非目的是学习与代表一起工作。他实际上告诉我,使用代表你可以在一行中写作,所以我只是尝试了一下……我理解,但我想打印周六和周日没有的日期……我的朋友说他可以在一行中编写整个程序。让他回答你的问题:我是c语言的初学者,所以我把我的问题贴在这里,这样我就可以学到新的东西。首先,你为什么选择用一个代理而不是一个方法?您正在添加不需要的开销。当然,除非目的是学习与代表一起工作。他实际上告诉我,使用代表可以在一行中书写,所以我只是尝试一下……我理解,但是我想打印星期六和星期日之后不需要的日期…对于单个返回声明,您不需要花括号和返回声明。对于单个返回声明,您不需要花括号和返回声明。我的问题是不计算。。。但是所有不属于周六和周日的日子,在给定的两个日期之间。我的问题是不计算。。。但是所有不在周六和周日的日子,在给定的两个日期之间。