Wie erstelle ich eine Folge von ganzen Zahlen in C #?


119

F # hat Sequenzen , mit denen Sequenzen erstellt werden können:

seq { 0 .. 10 }

Erstellen Sie eine Zahlenfolge von 0 bis 10.

Gibt es etwas Ähnliches in C #?

Antworten:


206

Sie können verwenden Enumerable.Range(0, 10);. Beispiel:

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

MSDN Seite hier .


66
Hinweis: Dadurch wird eine Sequenz erstellt, die bei 0 mit 10 Elementen beginnt (und bei 9 endet). Wenn Sie 0 bis 10 möchten , wäre der zweite Parameter 11. Wenn Sie ein tatsächliches Array benötigen und nicht IEnumerable<int>, schließen Sie einen Aufruf ein .ToArray().
Anthony Pegram


19

Sie können eine einfache Funktion erstellen. Dies würde für eine kompliziertere Sequenz funktionieren. Ansonsten Enumerable.Rangesollte das reichen.

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

Mit "komplizierter" meinen Sie nur "wo Sie Anfang und Ende haben, anstatt die Anzahl der Elemente"? Ansonsten fehlt mir deine Bedeutung. 🤔
ruffin

1
Ich glaube, ich habe über OddSequence EvenSequenceandere benutzerdefinierte Bereiche nachgedacht . if (++n1 % 2 == 0) yield return n1, zum Beispiel. Es ist ein paar Tage her;)
Josiah Ruddell

Ha, ja, ein oder zwei Tage, nehme ich an. Oder ein paar tausend. ; ^)
Ruffin

7

Linq-Projektion mit der selten verwendeten Indexerüberladung (i) :

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

Ich bevorzuge diese Methode wegen ihrer Flexibilität.

Zum Beispiel, wenn ich Abend will:

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

Oder wenn ich 5-Minuten-Schritte einer Stunde möchte:

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

Oder Zeichenfolgen:

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

Ich mag das wirklich, aber es fühlt sich gleichzeitig auch ein bisschen hackig an!
Zimano

lol :-) Es ist einfach eine großartige kreative Verwendung der Indexer-Überladung!
Zimano

2

In C # 8.0 können Sie Indizes und Bereiche verwenden

Beispielsweise:

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

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

Oder wenn Sie erstellen möchten, IEnumerable<int>können Sie die Erweiterung verwenden:

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 Aber seien Sie vorsichtig mit 'Indizes von Ende' . Beispielsweise funktioniert die ToEnumerable-Erweiterungsmethode nicht mit var seq = ^2..^0.


1

Meine Implementierung:

    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

Ursprünglich hier beantwortet .


Wenn Sie eine Folge von Zahlen ( IEnumerable<int>) 0bis zu einer Variablen auflisten möchten end, versuchen Sie es

Enumerable.Range(0, ++10);

Um eine Folge von Zahlen von 0 bis 10 zu erhalten, soll die Folge bei 0 beginnen (wobei zu beachten ist, dass es 11 Zahlen zwischen 0 und 10 einschließlich gibt).


Wenn Sie eine unbegrenzte lineare Reihe wünschen, können Sie eine Funktion wie schreiben

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

was du gerne gebrauchen könntest

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

Wenn Sie eine Funktion möchten, die Sie wiederholt aufrufen können, um inkrementelle Nummern zu generieren, möchten Sie vielleicht etwas Ähnliches.

using System.Threading;

private static int orderNumber = 0;

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

Wenn Sie anrufen Seq(), wird die nächste Bestellnummer zurückgegeben und der Zähler erhöht.


0

Ich habe diese Funktionen in meinem 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;
        }
    }

Dies hilft, einige für (i) Code zu reduzieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.