Как создать массив с последовательностью чисел в C#?


в F# есть последовательности что позволяет создавать последовательности:

seq { 0 .. 10 }

создать последовательность чисел от 0 до 10.

есть ли что-то подобное в C#?

6 87

6 ответов:

можно использовать Enumerable.Range(0, 10);. Пример:

var seq = Enumerable.Range(0, 10);

страница MSDN здесь.

Enumerable.Range(0, 11);

генерирует последовательность целых чисел в заданном диапазоне.

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.range.aspx

Вы можете создать простую функцию. Это будет работать для более сложных последовательностей. В противном случае Enumerable.Range должны сделать.

IEnumerable<int> Sequence(int n1, int n2)
{
    while (n1 <= n2)
    {
        yield return  n1++;
    }
}

моя реализация:

    private static IEnumerable<int> Sequence(int start, int end)
    {
        switch (Math.Sign(end - start))
        {
            case -1:
                while (start >= end)
                {
                    yield return start--;
                }

                break;

            case 1:
                while (start <= end)
                {
                    yield return start++;
                }

                break;

            default:
                yield break;
        }
    }

если вы хотите перечислить последовательность чисел (IEnumerable<int>) от 0 переменной end, затем попробовать

Enumerable.Range(0, ++end);

в объяснении, чтобы получить последовательность чисел от 0 до 1000, вы хотите, чтобы последовательность начиналась с 0 (помня, что есть 1001 число между 0 и 1000 включительно).


если вы хотите неограниченный линейный ряд, вы можете написать функцию, как

IEnumerable<int> Series(int k = 0, int n = 1, int c = 1)
{
    while (true)
    {
        yield return k;
        k = (c * k) + n;
    }
}

что вы могли бы использовать как

var ZeroTo1000 = Series().Take(1001);

если вы хотите функцию, которую вы можете вызвать несколько раз, чтобы генерировать увеличивающиеся числа, возможно, вы хотите что-то вроде.

using System.Threading;

private static int orderNumber = 0;

int Seq()
{
    return Interlocked.Increment(ref orderNumber);
}

когда вы называете Seq() он вернет следующий номер заказа и увеличит счетчик.

проекция Linq с редко используемым перегрузка индексатора (i):

(new int[11]).Select((o,i) => i)

Я предпочитаю этот метод для ее гибкость.

например, если я хочу evens:

(new int[11]).Select((item,i) => i*2)

или если я хочу 5 минут в час:

(new int[12]).Select((item,i) => i*5)

или строки:

(new int[12]).Select((item,i) => "Minute:" + i*5)