Comment créer une séquence d'entiers en C #?

119

F # a des séquences qui permettent de créer des séquences:

seq { 0 .. 10 }

Créez une séquence de nombres de 0 à 10.

Y a-t-il quelque chose de similaire en C #?

Budda
la source

Réponses:

206

Vous pouvez utiliser Enumerable.Range(0, 10);. Exemple:

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

Page MSDN ici .

Alexn
la source
66
Remarque: Cela crée une séquence commençant à 0 avec 10 éléments (se terminant à 9). Si vous voulez de 0 à 10, le deuxième paramètre serait 11. Et si vous avez besoin d'un tableau réel et non IEnumerable<int>, incluez un appel .ToArray().
Anthony Pegram
19

Vous pouvez créer une fonction simple. Cela fonctionnerait pour une séquence plus compliquée. Sinon, ça Enumerable.Rangedevrait faire l'affaire.

IEnumerable<int> Sequence(int n1, int n2)
{
    while (n1 <= n2)
    {
        yield return  n1++;
    }
}
Josiah Ruddell
la source
Par "plus compliqué", voulez-vous dire simplement "où vous avez le début et la fin à portée de main au lieu du nombre d'éléments"? Sinon, je manque votre sens. 🤔
ruffin le
1
Je crois que j'envisageais OddSequence EvenSequenceou d'autres gammes personnalisées. if (++n1 % 2 == 0) yield return n1, par exemple. Cela fait quelques jours;)
Josiah Ruddell
Ha, ouais, un ou deux jours je suppose. Ou quelques milliers. ; ^)
ruffin le
7

Projection Linq avec la surcharge d'indexeur rarement utilisée (i) :

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

Je préfère cette méthode pour sa flexibilité.

Par exemple, si je veux des évens:

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

Ou si je veux des incréments de 5 minutes d'une heure:

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

Ou des chaînes:

(new int[12]).Select((item,i) => "Minute:" + i*5)
b_levitt
la source
J'aime beaucoup ça mais ça me semble aussi un peu hacky en même temps!
Zimano le
lol :-) C'est juste une grande utilisation créative de la surcharge de l'indexeur!
Zimano le
2

En C # 8.0, vous pouvez utiliser des indices et des plages

Par exemple:

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

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

Ou si vous voulez créer, IEnumerable<int>vous pouvez utiliser l'extension:

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 Mais soyez prudent avec les «index de fin» . Par exemple, la méthode d'extension ToEnumerable ne fonctionne pas avec var seq = ^2..^0.

Evgeniy Mironov
la source
1

Ma mise en œuvre:

    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
la source
0

A l'origine répondu ici .


Si vous souhaitez énumérer une séquence de nombres ( IEnumerable<int>) de 0à une variable end, essayez

Enumerable.Range(0, ++10);

En guise d'explication, pour obtenir une séquence de nombres de 0 à 10, vous voulez que la séquence commence à 0 (en vous rappelant qu'il y a 11 nombres entre 0 et 10 inclus).


Si vous voulez une série linéaire illimitée, vous pouvez écrire une fonction comme

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

que vous pourriez utiliser comme

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

Si vous voulez une fonction que vous pouvez appeler à plusieurs reprises pour générer des nombres incrémentiels, peut-être voulez-vous quelque chose comme.

using System.Threading;

private static int orderNumber = 0;

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

Lorsque vous appelez, Seq()il renverra le numéro de commande suivant et incrémentera le compteur.

Jodrell
la source
0

J'ai ces fonctions dans mon code

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

Cela aide à réduire certains pour (i) code.

haiduong87
la source