Come creare una sequenza di numeri interi in C #?


119

F # ha sequenze che consentono di creare sequenze:

seq { 0 .. 10 }

Crea una sequenza di numeri da 0 a 10.

C'è qualcosa di simile in C #?

Risposte:


206

Puoi usare Enumerable.Range(0, 10);. Esempio:

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

Pagina MSDN qui .


66
Nota: questo crea una sequenza che inizia da 0 con 10 elementi (termina con 9). Se si desidera un numero compreso tra 0 e 10, il secondo parametro sarà 11. E se è necessario un array effettivo e non IEnumerable<int>, includere una chiamata .ToArray().
Anthony Pegram


19

Potresti creare una semplice funzione. Questo funzionerebbe per una sequenza più complicata. Altrimenti Enumerable.Rangedovrebbe fare.

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

Con "più complicato" intendi solo "dove hai inizio e fine a portata di mano invece del numero di elementi"? Altrimenti mi manca il tuo significato. 🤔
ruffin

1
Credo che stavo valutando OddSequence EvenSequenceo altre gamme personalizzate. if (++n1 % 2 == 0) yield return n1, per esempio. Sono passati alcuni giorni;)
Josiah Ruddell,

Ah, sì, uno o due giorni suppongo. O qualche migliaio. ; ^)
ruffin

7

Proiezione di Linq con il sovraccarico dell'indicizzatore usato raramente (i) :

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

Preferisco questo metodo per la sua flessibilità.

Ad esempio, se voglio uniformi:

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

O se voglio incrementi di 5 minuti di un'ora:

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

O stringhe:

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

Mi piace molto ma allo stesso tempo sembra anche un po 'hacky!
Zimano

lol :-) È solo un ottimo uso creativo del sovraccarico dell'indicizzatore!
Zimano

2

In C # 8.0 è possibile usare indici e intervalli

Per esempio:

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 se vuoi creare IEnumerable<int>, puoi usare l'estensione:

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 Ma fai attenzione agli "indici dalla fine" . Ad esempio, il metodo di estensione ToEnumerable non funziona con var seq = ^2..^0.


1

La mia implementazione:

    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

Originariamente risposto qui .


Se vuoi enumerare una sequenza di numeri ( IEnumerable<int>) da 0a una variabile end, prova

Enumerable.Range(0, ++10);

Spiegando, per ottenere una sequenza di numeri da 0 a 10, vuoi che la sequenza inizi da 0 (ricordando che ci sono 11 numeri compresi tra 0 e 10 inclusi).


Se vuoi una serie lineare illimitata, potresti scrivere una funzione come

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

che potresti usare come

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

Se vuoi una funzione che puoi chiamare ripetutamente per generare numeri incrementali, forse vuoi qualcosa di simile.

using System.Threading;

private static int orderNumber = 0;

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

Quando lo chiami Seq(), restituirà il numero dell'ordine successivo e incrementerà il contatore.


0

Ho queste funzioni nel mio codice

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

Questo aiuta a ridurre un po 'di codice per (i).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.