¿Cómo crear una secuencia de números enteros en C #?

119

F # tiene secuencias que permiten crear secuencias:

seq { 0 .. 10 }

Crea una secuencia de números del 0 al 10.

¿Hay algo similar en C #?

Budda
fuente

Respuestas:

206

Puede utilizar Enumerable.Range(0, 10);. Ejemplo:

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

Página de MSDN aquí .

alexn
fuente
66
Nota: Esto crea una secuencia que comienza en 0 con 10 elementos (termina en 9). Si desea de 0 a 10, el segundo parámetro sería 11. Y si necesita una matriz real y no IEnumerable<int>, incluya una llamada .ToArray().
Anthony Pegram
19

Podría crear una función simple. Esto funcionaría para una secuencia más complicada. De lo contrario, Enumerable.Rangedebería hacerlo.

IEnumerable<int> Sequence(int n1, int n2)
{
    while (n1 <= n2)
    {
        yield return  n1++;
    }
}
Josiah Ruddell
fuente
Por "más complicado", ¿te refieres simplemente a "dónde tienes a mano el comienzo y el final en lugar del número de elementos"? De lo contrario, me estoy perdiendo tu significado. 🤔
ruffin
1
Creo que estaba considerando OddSequence EvenSequenceotros rangos personalizados. if (++n1 % 2 == 0) yield return n1, por ejemplo. Han pasado unos días;)
Josiah Ruddell
Ja, sí, uno o dos días, supongo. O algunos miles. ; ^)
ruffin
7

Proyección de LINQ con el rara vez se utiliza la sobrecarga indexador (i) :

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

Prefiero este método por su flexibilidad.

Por ejemplo, si quiero pares:

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

O si quiero incrementos de 5 minutos de una hora:

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

O cuerdas:

(new int[12]).Select((item,i) => "Minute:" + i*5)
b_levitt
fuente
¡Realmente me gusta esto, pero también se siente un poco extraño al mismo tiempo!
Zimano
lol :-) ¡Es un gran uso creativo de la sobrecarga del indexador!
Zimano
2

En C # 8.0 puede usar índices y rangos

Por ejemplo:

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

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

O si desea crear IEnumerable<int>, puede usar la extensión:

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

PD: Pero ten cuidado con los "índices desde el final" . Por ejemplo, el método de extensión ToEnumerable no funciona con var seq = ^2..^0.

Evgeniy Mironov
fuente
1

Mi implementación:

    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;
        }
    }
Dicaste
fuente
0

Originalmente respondido aquí .


Si desea enumerar una secuencia de números ( IEnumerable<int>) desde 0una variable end, intente

Enumerable.Range(0, ++10);

En explicación, para obtener una secuencia de números del 0 al 10, desea que la secuencia comience en 0 (recordando que hay 11 números entre 0 y 10, inclusive).


Si desea una serie lineal ilimitada, puede escribir una función como

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

que podrías usar como

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

Si desea una función a la que pueda llamar repetidamente para generar números crecientes, tal vez desee algo como.

using System.Threading;

private static int orderNumber = 0;

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

Cuando llame Seq(), devolverá el siguiente número de pedido e incrementará el contador.

Jodrell
fuente
0

Tengo estas funciones en mi código

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

Esto ayuda a reducir algo de código para (i).

haiduong87
fuente