2010-04-21 34 views
9

Tôi đang cố gắng để lặp qua MỖI DAYof tuần giữa 2 khoảng thời gianLooping thông qua các ngày trong tuần bên trong C# TimeSpan Lớp

DateTime start = new DateTime(2010, 1, 1); 
    DateTime end = new DateTime(2011, 12, 12); 

tôi đã được quản lý để có được số ngày giữa những ngày sử dụng đoạn mã sau

 TimeSpan range = (end - start); 

bật ra được 710.

tôi bây giờ muốn nhận được cho mỗi tháng ngày trong tuần,

0.123.

Ví dụ:

Jan 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 171 18 19 20. . .

với phù hợp với

CN H Ba T F S S M T W T F S S M

Tôi hiểu C# có một tài sản từ DateTime lớp dayOfWeek mà được các ngày trong tuần vấn đề của tôi là xây dựng một vòng lặp để làm các việc trên?

bất kỳ ai?

+1

cách nhanh: http://stackoverflow.com/questions/22258070/datetime-dayofweek-micro-optimization – rpax

Trả lời

20

Điều này sẽ lặp lại tất cả các ngày từ ngày bắt đầu đến ngày kết thúc và nhận được ngày trong tuần cho mỗi ngày.

DateTime startDate = new DateTime(2010, 1, 1); 
DateTime endDate = new DateTime(2011, 12, 12); 
for (DateTime date = startDate; date <= endDate; date = date.AddDays(1)) 
{ 
    DayOfWeek dw = date.DayOfWeek; 
    // ... 
} 

Trừ khi bạn thực sự lo lắng về tối ưu hóa, tôi sẽ không làm mọi thứ trở nên phức tạp hơn.

+0

cho (ngày DateTime = STARTDATE; ngày <= ENDDATE; date = date.AddDays (1)) { DayOfWeek dw = date.DayOfWeek; // ... } Cảm ơn rất nhiều, Đánh giá cao :) – Calibre2010

+0

Nếu anh ấy thực sự lo lắng về tối ưu hóa, anh ấy có thể xem http://stackoverflow.com/questions/22258070/datetime-dayofweek-micro -tối ưu hóa . Thật buồn cười – rpax

+0

Khó có vẻ đáng để thay thế một chức năng tùy chỉnh (và có thể lỗi) cho một phương thức thư viện, đặc biệt là khi nó thậm chí không thay đổi độ phức tạp của Big-O. Và một lần nữa, nếu bạn đang hoạt động dưới * thực sự * ràng buộc hiệu suất chặt chẽ - bạn chỉ có thể tránh toàn bộ phép tính và chỉ lặp lại từ 1 đến 7 với điều kiện thử nghiệm đơn giản. Tôi thích phương pháp trên bởi vì nó đơn giản để đọc/hiểu, mà 9 lần trong số 10 nên là mục tiêu của bạn. – Aaronaught

3

Tôi thích như sau:

static IEnumerable Days(DateTime start, DateTime end) 
{ 
    while (start < end) 
    { 
     string day = start.ToString("ddd"); 

     start = start.AddDays(1); 

     yield return day; 
    } 
} 

Làm thế nào để sử dụng nó:

foreach(string s in Days(new DateTime(2010, 1, 1), new DateTime(2010, 2, 1))) 
{ 
    Console.WriteLine(s); 
} 

Bạn có thể sửa đổi nó để trở lại các loại khác nhau, tất nhiên.

2

Sử dụng LINQ:

DateTime start = new DateTime(2010, 1, 1); 
DateTime end = new DateTime(2011, 12, 12); 
int days = (end - start).Days; 

Enumerable 
    .Range(0, days) 
    .Select(x => start.AddDays(x)) 
    .ToList() 
    .ForEach(d => 
    { 
     DayOfWeek dayOfWeek = d.DayOfWeek; 
     // do what you want 
    }); 
+0

Giải pháp tuyệt vời :) –

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