[英]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);
盡管這可能無法回答您的問題,但重要的是要告訴您根本不應該這樣做,這有兩個原因。
編寫可讀代碼非常重要,並且您現有的代碼會盡可能地完善。 復雜的單行代碼不僅會使它的可讀性降低,而且使調試更加困難。 整體維護是一場噩夢。
您的目標是帶來副作用,而不是經過一些計算后返回值。 換句話說,您的代表返回void
。 Linq樣式查詢不是解決之道。
還有兩個建議:
我在您的代碼中看到了ArrayList
。 從.NET 2開始使用它是犯罪行為。 請參閱此。 如果將其更改為List<T>
則將被譽為英雄。 如果您的朋友很聰明,那么他應該在基本問題上幫助您,而不是做書呆子。
以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.