簡體   English   中英

使用C#中的委托來計算工作日數的最簡單方法?

[英]Simplest way of calculating the number of working days using delegates in c#?

這是我的簡單代碼,我使用委托和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));

要么

 var days = Enumerable
            .Range(0, (int)d2.Subtract(d1).TotalDays + 1)
            .Select(x => d1.AddDays(x))
            .Count(x => x.DayOfWeek != DayOfWeek.Saturday && x.DayOfWeek != DayOfWeek.Sunday);

盡管這可能無法回答您的問題,但重要的是要告訴您根本不應該這樣做,這有兩個原因。

  1. 編寫可讀代碼非常重要,並且您現有的代碼會盡可能地完善。 復雜的單行代碼不僅會使它的可讀性降低,而且使調試更加困難。 整體維護是一場噩夢。

  2. 您的目標是帶來副作用,而不是經過一些計算后返回值。 換句話說,您的代表返回void Linq樣式查詢不是解決之道。

還有兩個建議:

  1. 我在您的代碼中看到了ArrayList 從.NET 2開始使用它是犯罪行為。 請參閱此。 如果將其更改為List<T>則將被譽為英雄。 如果您的朋友很聰明,那么他應該在基本問題上幫助您,而不是做書呆子。

  2. Get...開頭的名稱不是返回(獲取)任何內容( void )的方法(或委托)的好名字。 我將其稱為WorkingDaysPrinter左右。


僅僅為了它,您的答案將是這樣的:

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 + " ");
                                              });

這是稍微一點單獨編寫查詢,然后運行一個單獨foreach

WorkingDaysPrinter p = (d1, d2) => 
{
    var query = Enumerable.Range(0, d2.Subtract(d1).Days)
                          .Select(x => d1.AddDays(x))
                          .Where((x, i) => i == 0 || x.DayOfWeek != DayOfWeek.Sunday);
    foreach (var day in query)
    {
        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 + " ");
}
var count = Enumerable
        .Range(1, (int)y.Subtract(x).TotalDays)
        .Select(x => to.AddDays(x))
        .Count(x => x.DayOfWeek != DayOfWeek.Saturday && x.DayOfWeek != DayOfWeek.Sunday);
GetWorkingDays getWorkDays = (d1, d2) =>
    Enumerable.Range(1, (int)(dt2 - dt1).TotalDays)
        .Select(d => dt1.AddDays(d))
        .Where(d => d.DayOfWeek != DayOfWeek.Saturday && d.DayOfWeek != DayOfWeek.Sunday)
        .ToList()
        .ForEach(d => Console.Write(d.Day + " "));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM