Какой лучший способ написать [0..100] на C #? - PullRequest
15 голосов
/ 11 октября 2008

Я пытаюсь придумать умные, ясные и простые способы написания кода, который описывает последовательность целых чисел в заданном диапазоне.

Вот пример:

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

Ответы [ 4 ]

63 голосов
/ 11 октября 2008

Это уже в рамках: Enumerable.Range .

Для других типов вас могут заинтересовать классы диапазонов в моей библиотеке MiscUtil .

7 голосов
/ 12 октября 2008

Альтернативно, свободный интерфейс из методов расширения:

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);
    }
}

используется как:

1.To(100)
0 голосов
/ 12 октября 2008

И если вы считаете, что каждый раз доставлять перечислитель раздражает, вот производный класс:

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();
    }
}
0 голосов
/ 12 октября 2008

Вот идея, которая позволяет классу диапазона работать как с дискретными, так и с другими вещами:

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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...