2009-08-26 49 views
12

Trong vb.net Tôi có hai giá trị dữ liệu như hình dưới đây:Ngày trong vòng lặp for trong vb.net

Dim startp as datetime 
Dim endp as datetime 

Tôi có một chức năng gọi là ProcessData(soemdate) mà xử lý dataporting.

Trong VB.net là có cách nào tôi có thể làm điều gì đó như

For each day between startp and endp 
ProcessData(soemdate) 
Next 

Cảm ơn

+0

Chỉ cần 2 xu của tôi ở đây, nhưng nếu chức năng của bạn thực sự được gọi là "ProcessData" bạn có thể muốn xem xét một cái gì đó một chút mô tả để bảo trì. Nếu đó chỉ là một tên hàm giả thuyết, vui lòng bỏ qua nhận xét này. – JohnFx

Trả lời

19

Đây là một cách khác để thực hiện việc này.

Dim startP As DateTime = New DateTime(2009, 1, 1) 
Dim endP As DateTime = New DateTime(2009, 2, 1) 
Dim CurrD As DateTime = startP 

While (CurrD <= endP)   
    ProcessData(CurrD) 
    Console.WriteLine(CurrD.ToShortDateString) 
    CurrD = CurrD.AddDays(1) 
End While 
+0

thats the one here. –

18
For Each Day As DateTime in Enumerable.Range(0, (endp - startp).Days) _ 
          .Select(Function(i) startp.AddDays(i)) 
    ProcessData(Day) 
Next Day 
+7

+1 cho cách tiếp cận enumerable.range (mẹo vặt) -1 vì bị làm phiền một chút vì mục đích mà bất kỳ ai cần hỗ trợ nó. – JohnFx

+0

Xin lỗi vì sự chậm trễ trên bản dịch VB - một thứ gì đó xuất hiện tại nơi làm việc mà tôi đã ưu tiên chú ý. –

+0

Tôi thừa nhận lừa Enumerable.Range trông kỳ lạ lần đầu tiên bạn nhìn thấy, nhưng nó là một trong những điều đó, một khi bạn nhận được nó, bạn tự hỏi tại sao bạn đã bao giờ làm nó bất kỳ cách nào khác. –

0

Có, bạn có thể sử dụng một ngày ắc:

Dim Accumulator as DateTime 
Accumulator = startp 

While (Accumulator <= endp) 


    Accumulator = Accumulator.AddDays(1) 
End While 

Không thử nghiệm , và tôi là lập trình viên C#, vì vậy dễ dàng nếu cú ​​pháp của tôi sai.

-1

Đặt bảng lịch với tất cả các ngày và giá trị truy vấn từ đó.

SQL:

Select Date as MyDate from tblCalendar Where Date >= StartDt And Date <= EndDate 

NET:

While Reader.read 
    process(MyDate) 
End While 
8

Thêm vào câu trả lời Joel Coehoorn của mà cá nhân tôi nghĩ rằng nên là câu trả lời được chấp nhận như tôi luôn cố gắng tránh khi vòng bất kể có bao an toàn họ có thể xuất hiện. Đối với ... Mỗi là một cách tiếp cận an toàn hơn nhiều mặc dù enumerable không phải là rất đẹp trong dòng. Tuy nhiên, bạn có thể di chuyển nó đến một chức năng để giữ cho mọi thứ dễ đọc hơn, cộng với bạn có thể tái sử dụng khi cần thiết.

For Each Day As DateTime In DateRange(StartDate, EndDate) 
    ProcessData(Day) 
    Console.WriteLine(Day.ToShortDateString) 
Next 

Public Shared Function DateRange(Start As DateTime, Thru As DateTime) As IEnumerable(Of Date) 
    Return Enumerable.Range(0, (Thru.Date - Start.Date).Days + 1).Select(Function(i) Start.AddDays(i)) 
End Function 

Tôi cũng đã thêm từ 1 tới phạm vi Enumerable kể từ khi Joel đã có nó, nó sẽ không trở về ngày kết thúc và trong hoàn cảnh của tôi, tôi cần nó để trả lại tất cả số ngày trong phạm vi bao gồm cả đầu và cuối ngày.

Enumerable.Range là một loại vòng lặp tự thêm i ngày vào tiến trình startdate i với mỗi cuộc gọi từ trong trường hợp này 0 đến sự khác biệt giữa ngày bắt đầu và ngày kết thúc + 1. Lần đầu tiên được gọi là bạn nhận được kết quả của Start.AddDays (0), tiếp theo bạn sẽ nhận được Start.AddDays (1) và tiếp tục cho đến khi phạm vi hoàn tất.

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