2009-02-10 29 views

Trả lời

75

Tôi sẽ sử dụng một vòng lặp mà trông giống như

for(DateTime date = begin; date <= end; date = date.AddDays(1)) 
{ 
} 

Set này bắt đầu và kết thúc cho phù

6
DateTime dateTime = new DateTime(2009, 1, 1);  

while(dateTime.Year < 2010) 
    { 

     dateTime = dateTime.AddDays(1); 
    } 
+2

Thêm ngày trả về ngày giờ thay vì tăng ngày giờ hoạt động. – Ray

3

Đặt hai biến:

DateTime lowValue = DateTime.Parse("1/1/2009"); 
DateTime highValue = DateTime.Parse("12/31/2009"); 

Sau đó, thêm một ngày để các giá trị thấp cho đến khi giá trị bằng giá trị cao:

while (lowValue <= highValue) 
{ 
    //Do stuff here 
    lowValue = lowValue.AddDays(1); 
} 

Hoặc điều gì đó tương tự.

+0

đã sửa lỗi gán và truyền lỗi của bạn. –

+0

và lỗi off-by-one –

0
DateTime current = DateTime.Parse("1/1/2009"); 
DateTime nextYear = current.AddYears(1); 
do 
{ 
    Console.WriteLine(current); 
    current = current.AddDays(1); 
} while (current < nextYear) ; 
1

int day; for (int i = 1; i<365;i++) { day++; }

Xin lỗi, không thể cưỡng lại.

+1

làm thế nào có thể được thực hiện cho năm nhuận? –

+0

@ user1542476 bạn chỉ cần sử dụng 366. – Kristopher

5

Tôi muốn sử dụng MiscUtil và phương pháp khuyến nông của nó:

foreach(DateTime date in 1.January(2009) 
         .To(31.December(2009)) 
         .Step(1.Days()) 
{ 
    Console.WriteLine(date); 
} 
18

Một tùy chọn khác thực hiện việc thiết kế mẫu Iterator:

này nghe có vẻ không cần thiết, nhưng tôi tùy thuộc vào cách bạn sử dụng chức năng này , bạn cũng có thể triển khai Iterator design pattern.

Hãy nghĩ về điều này. Giả sử tất cả mọi thứ hoạt động tốt, và bạn sao chép/dán tất cả các nơi trên "cho" câu. Và đột nhiên như một phần của yêu cầu, bạn phải lặp lại tất cả các ngày nhưng bỏ qua một số trong số đó (như trong lịch, bỏ qua holydays, cuối tuần, tùy chỉnh, v.v.)

Bạn sẽ phải tạo một "mới" và sử dụng Thay vào đó là lịch. Sau đó tìm kiếm và thay thế tất cả của bạn.

Trong OOP, điều này có thể đạt được bằng cách sử dụng mẫu Iterator.

Từ Wikpedia:

Trong lập trình hướng đối tượng, mô hình Iterator là một mẫu thiết kế trong đó lặp được sử dụng để truy cập vào các yếu tố của một đối tượng tuần tự tổng hợp mà không lộ đại diện cơ bản của nó. Một đối tượng Iterator gói gọn cấu trúc nội bộ của cách lặp lại xảy ra.

Vì vậy, ý tưởng là sử dụng một cấu trúc như thế này:

 DateTime fromDate = DateTime.Parse("1/1/2009"); 
     DateTime toDate = DateTime.Parse("12/31/2009"); 

     // Create an instance of the collection class 
     DateTimeEnumerator dateTimeRange = 
           new DateTimeEnumerator(fromDate, toDate); 


     // Iterate with foreach 
     foreach (DateTime day in dateTimeRange) 
     { 
      System.Console.Write(day + " "); 
     } 

Và sau đó nếu cần thiết bạn có thể tạo các lớp con để thực hiện các thuật toán khác nhau, một sử dụng AddDay (1), khác có sử dụng AddDay (7) hoặc cách khác đơn giản sử dụng Lịch thay thế. Vân vân.

Ý tưởng là giảm khớp nối giữa các đối tượng.

Một lần nữa, điều này sẽ là quá mức cần thiết cho hầu hết các trường hợp, nhưng nếu lặp lại tạo thành liên quan một phần của hệ thống (giả sử, bạn đang tạo một loại thông báo nào đó, cho doanh nghiệp và phải tuân theo toàn cầu hoá khác nhau

việc thực hiện cơ bản của khóa học sẽ sử dụng cho.

public class DateTimeEnumerator : System.Collections.IEnumerable 
{ 
    private DateTime begin; 
    private DateTime end; 

    public DateTimeEnumerator (DateTime begin , DateTime end) 
    { 
     // probably create a defensive copy here... 
     this.begin = begin; 
     this.end = end; 
    } 
    public System.Collections.IEnumerator GetEnumerator() 
    { 
     for(DateTime date = begin; date < end; date = date.AddDays(1)) 
     { 
      yield return date; 
     } 
    } 
} 

Chỉ cần một ý tưởng :)

2

một phương pháp khác có thể được tái sử dụng hơn là w rite một phương pháp mở rộng trên DateTime và trả về một IEnumerable.

Ví dụ, bạn có thể định nghĩa một lớp:

public static class MyExtensions 
{ 
    public static IEnumerable EachDay(this DateTime start, DateTime end) 
    { 
     // Remove time info from start date (we only care about day). 
     DateTime currentDay = new DateTime(start.Year, start.Month, start.Day); 
     while (currentDay <= end) 
     { 
      yield return currentDay; 
      currentDay = currentDay.AddDays(1); 
     } 
    } 
} 

Bây giờ trong mã gọi bạn có thể làm như sau:

DateTime start = DateTime.Now; 
DateTime end = start.AddDays(20); 
foreach (var day in start.EachDay(end)) 
{ 
    ... 
} 

Một ưu điểm khác để tiếp cận này là nó làm cho nó tầm thường để thêm EveryWeek, EachMonth, vv. Sau đó, tất cả sẽ được truy cập trên DateTime.

Các vấn đề liên quan