2012-07-23 19 views
5

Có cách nào để tạo danh sách khoảng thời gian không? Ví dụ: Danh sách chứa: 12:00 đến 1:00 pm 1:00 đến 2:00 pm vv ... Trường hợp phần chia là cấu hình. Tôi nghĩ bạn phải sử dụng datetime và chia nó thành một số nhất định (trong trường hợp này một giờ)C# Có cách nào để tạo danh sách khoảng thời gian không? Có thể định cấu hình

Ai đó có thể vui lòng chỉ cho tôi một hướng đi đúng không?

Cảm ơn trước!

Trả lời

6

Không có loại được cài sẵn để xác định phạm vi thời gian nhưng sẽ dễ dàng tạo một loại thời gian bằng cách kết hợp một số DateTimeTimeSpan. Ví dụ:

struct TimeRange 
{ 
    private readonly DateTime start; 
    private readonly TimeSpan duration; 

    public TimeRange (DateTime start, TimeSpan duration) 
    { 
     this.start = start; 
     this.duration = duration; 
    } 
} 

Sau đó, bạn có thể xây dựng một List<TimeRange> sử dụng cụ thể DateTime như là điểm khởi đầu và thêm các yêu cầu TimeSpan cho mỗi phần tử. Ví dụ: đây là triển khai rất cơ bản của TimeRange bao gồm phương thức được gọi là Split trả về một IEnumerable<TimeRange> dựa trên TimeRange hiện tại và thời lượng bắt buộc của các phạm vi phụ.

struct TimeRange 
{ 
    private readonly DateTime start; 
    private readonly TimeSpan duration; 

    public TimeRange (DateTime start, TimeSpan duration) 
    { 
     this.start = start; 
     this.duration = duration; 
    } 

    public DateTime From { get { return start; } } 

    public DateTime To { get { return start + duration; } } 

    public TimeSpan Duration { get { return duration; } } 

    public IEnumerable<TimeRange> Split (TimeSpan subDuration) 
    { 
     for (DateTime subRangeStart = From; subRangeStart < this.To; subRangeStart += subDuration) 
     { 
      yield return new TimeRange(subRangeStart, subDuration); 
     } 
    } 

    public override string ToString() 
    { 
     return String.Format ("{0} -> {1}", From, To); 
    } 
} 

Sau đó bạn có thể làm một cái gì đó như thế này:

TimeRange mainRange = new TimeRange(DateTime.Now, new TimeSpan(12, 0, 0)); 
List<TimeRange> rangeList = mainRange.Split(new TimeSpan(1, 0, 0)).ToList(); 

này sẽ cung cấp một danh sách của 12 dãy thời điểm thời gian 1 giờ kể từ thời điểm hiện tại.

** Cập nhật **

Lưu ý rằng việc triển khai ở trên là rất cơ bản. Ví dụ, phương thức Split sẽ vui vẻ tạo ra một phạm vi các phạm vi mà kết thúc của phạm vi phụ cuối vượt quá phạm vi của phạm vi gốc nếu khoảng thời gian phụ không phải là một bộ phận tách rời của phạm vi gốc. Nó sẽ là khó khăn để thêm kiểm tra cho loại điều này, mặc dù. Câu hỏi thực sự là những gì bạn muốn xảy ra trong các kịch bản đó.

Nó cũng sẽ rất dễ dàng để tạo phương thức tĩnh TimeRange.CreateList xây dựng một List<TimeRange> mà không cần phạm vi cha mẹ rõ ràng.

+0

Đây là câu trả lời rất hay. Nếu thời gian tôi đặt thành 2, tôi có nhận được chính xác 2 giờ không? ví dụ: TimeRange (10,2) vì vậy tôi nhận được 10 đến 12 là một phạm vi? –

+0

Tôi bị cám dỗ khi chỉ nói "thử và xem" nhưng, vâng, đó là những gì bạn sẽ nhận được. Bạn cũng có thể sử dụng thời lượng 'TimeSpan mới (1, 30, 0)' để có phạm vi 1,5 giờ (ví dụ: 10:00 đến 11:30), chẳng hạn. –

+0

Cảm ơn bạn rất nhiều vì đã trả lời. –

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