2008-10-11 22 views
14

Tôi đang cố gắng nghĩ ra các cách thông minh, rõ ràng và đơn giản để viết mã mô tả chuỗi các số nguyên trong một phạm vi nhất định.Cách tốt nhất để viết [0..100] trong C# là gì?

Dưới đây là một ví dụ:

IEnumerable<int> EnumerateIntegerRange(int from, int to) 
{ 
    for (int i = from; i <= to; i++) 
    { 
     yield return i; 
    } 
} 

Trả lời

62

này đã nằm trong khuôn khổ: Enumerable.Range.

Đối với các loại khác, bạn có thể quan tâm đến các lớp phạm vi trong thư viện MiscUtil của mình.

+0

Liên kết không hợp lệ tại đây Jon –

+3

@Sam: Làm việc cho tôi, điều gì xấu? –

+2

@Sam: Cái nào không hiệu quả với bạn, và bạn đang làm gì? –

0

Dưới đây là một ý tưởng cho phép một tác phẩm đẳng cấp tầm hoạt động với cả những điều rời rạc và những người mà không phải là:

class Range<T> where T: IComparable<T> 
{ 
    public T From { get; set; } 
    public T To { get; set; } 

    public Range(T from, T to) { this.From = from; this.To = to; } 

    public IEnumerable<T> Enumerate(Func<T, T> next) 
    { 
     for (T t = this.From; t.CompareTo(this.To) < 0; t = next(t)) 
     { 
      yield return t; 
     } 
    } 

    static void Example() 
    { 
     new Range<int> (0, 100).Enumerate(i => i+1) 
    } 
} 
0

Và nếu bạn nghĩ rằng việc cung cấp điều tra viên mỗi lần là khó chịu, đây là một lớp được thừa kế:

class EnumerableRange<T> : Range<T>, IEnumerable<T> 
    where T : IComparable<T> 
{ 
    readonly Func<T, T> _next; 
    public EnumerableRange(T from, T to, Func<T, T> next) 
     : base(from, to) 
    { 
     this._next = next; 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     return Enumerate(this._next).GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 
} 
+1

Tôi đã tìm thấy nó cung cấp sự tách biệt tốt hơn để có một lớp Range và một lớp RangeIterator riêng biệt. Ngoài bất cứ điều gì khác, điều đó có nghĩa là Phạm vi của bạn có thể không thay đổi và được niêm phong, điều đó thật tuyệt. Phiên bản trong MiscUtil có các phương thức khác nhau (phần mở rộng và cách khác) để đi giữa hai phương thức. –

+0

Vâng, tôi đã thấy một trong MiscUtil. Phạm vi của tôi có thể không thay đổi; lý do duy nhất cho khả năng thay đổi, đối với tôi, là nó cho phép khởi tạo đối tượng C#. Có lẽ tôi nên đi vì sự bất biến. –

7

cách khác, một giao diện thông thạo từ phương pháp khuyến nông:

public static IEnumerable<int> To(this int start, int end) 
{ 
    return start.To(end, i => i + 1); 
} 

public static IEnumerable<int> To(this int start, int end, Func<int, int> next) 
{ 
    int current = start; 
    while (current < end) 
    { 
     yield return current; 
     current = next(current); 
    } 
} 

được sử dụng như:

1.To(100) 
+0

Cá nhân, tôi thích cách mà phương pháp mở rộng đọc tốt hơn. Mặc dù, tôi có một chút của một mặt mềm cho các phương pháp mở rộng (tôi thực hiện chúng cho VB). Tôi chưa bao giờ hiểu lý do tại sao những người dùng C# không làm cho Range trở thành một phương pháp mở rộng ngay từ đầu. –

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