Як створити послідовність цілих чисел у C #?


119

F # має послідовності, що дозволяє створювати послідовності:

seq { 0 .. 10 }

Створіть послідовність чисел від 0 до 10.

Чи є щось подібне в C #?

Відповіді:


206

Можна використовувати Enumerable.Range(0, 10);. Приклад:

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

Сторінка MSDN тут .


66
Примітка. Це створює послідовність, починаючи з 0 з 10 елементів (закінчуючи на 9). Якщо ви хочете від 0 до 10, другим параметром буде 11. І якщо вам потрібен фактичний масив, а ні IEnumerable<int>, включіть виклик .ToArray().
Ентоні Пеграм


19

Ви можете створити просту функцію. Це працювало б для більш складної послідовності. Інакше Enumerable.Rangeслід робити.

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

Під "складнішим" ви маєте на увазі просто "де ви починаєте і закінчуєте зручно замість кількості елементів"? Інакше мені не вистачає твого значення. 🤔
ruffin

1
Я вважаю, я розглядав OddSequence EvenSequenceчи інші спеціальні діапазони. if (++n1 % 2 == 0) yield return n1, наприклад. Минуло кілька днів;)
Джосія Рудделл

Ха, так, я думаю, один-два дні. Або кілька тисяч. ; ^)
ruffin

7

Проекція Linq з рідко використовуваним перевантаженням індексатора (i) :

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

Я віддаю перевагу цьому методу для його гнучкості.

Наприклад, якщо я хочу рівних:

(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)

Мені це дуже подобається, але він також відчуває себе трохи хакітним!
Zimano

lol :-) Це просто чудове творче використання перевантаження індексатора!
Zimano

2

У C # 8.0 ви можете використовувати індекси та діапазони

Наприклад:

var seq = 0..2;
var array = new string[]
{
    "First",
    "Second",
    "Third",
};

foreach(var s in array[seq])
{
    System.Console.WriteLine(s);
}
// Output: First, Second

Або якщо ви хочете створити, IEnumerable<int>ви можете використовувати розширення:

public static IEnumerable<int> ToEnumerable(this Range range)
{
   for (var i = range.Start.Value; i < range.End.Value; i++)
   {
       yield return i;
   }
}
...
var seq = 0..2;

foreach (var s in seq.ToEnumerable())
{
   System.Console.WriteLine(s);
}
// Output: 0, 1

PS Але будьте обережні з "індексами від кінця" . Наприклад, метод розширення ToEnumerable не працює var seq = ^2..^0.


1

Моя реалізація:

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

0

Спочатку відповів тут .


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

Enumerable.Range(0, ++10);

Пояснюючи, щоб отримати послідовність чисел від 0 до 10, потрібно, щоб послідовність починалася з 0 (пам'ятаючи, що 11 чисел між 0 і 10 включно).


Якщо потрібно необмежений лінійний ряд, ви можете написати таку функцію, як

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(11);

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

using System.Threading;

private static int orderNumber = 0;

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

Коли ви телефонуєте, Seq()він повертає наступний номер замовлення та збільшує лічильник.


0

Ці функції у мене в коді

private static IEnumerable<int> FromZero(this int count)
    {
        if (count <= 0)
            yield break;

        for (var i = 0; i < count; i++)
        {
            yield return i;
        }
    }

    private static IEnumerable<int> FromOne(this int count)
    {
        if (count <= 0)
            yield break;

        for (var i = 1; i <= count; i++)
        {
            yield return i;
        }
    }

Це допомагає зменшити деякі для (i) коду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.