5 Stimmen

Einfache Sequenzerstellung?

Ich bin auf der Suche nach einer einfachen Möglichkeit, eine Liste mit Zahlen von 1-200 zu erstellen. (es kann eine Liste, ein Array, ein Enumerable sein... Ich kümmere mich nicht wirklich über den spezifischen Typ)

Anscheinend hat .Net 4.0 eine Sequence.Range(min,max) Methode. Aber ich bin derzeit auf .Net 3.5.

Hier ist ein Beispiel für die Verwendung dessen, was ich suche, mit Sequence.Range gezeigt.

public void ShowOutput(Sequence.Range(1,200));

Im Moment brauche ich die Folgezahlen 1-200. In zukünftigen Iterationen kann ich beliebige Listen von Zahlen benötigen, daher versuche ich, das Design flexibel zu halten.

Vielleicht gibt es eine gute LINQ-Lösung? Haben Sie eine andere Idee?

16voto

Daniel Earwicker Punkte 111630

.NET 3,5 hat Range auch. Es ist eigentlich Enumerable.Range und gibt zurück IEnumerable<int> .

Die Seite, auf die du verlinkt hast, ist sehr veraltet - sie spricht von 3 als einer "zukünftigen Version" und die Enumerable statische Klasse wurde aufgerufen Sequence zu einem Zeitpunkt vor der Veröffentlichung.

Wenn Sie es selbst in C# 2 oder höher implementieren möchten, ist das ganz einfach - hier ist eines:

IEnumerable<int> Range(int count)
{
    for (int n = 0; n < count; n++)
        yield return n;
}

Sie können leicht andere Methoden schreiben, die weitere Listen filtern:

IEnumerable<int> Double(IEnumerable<int> source)
{
    foreach (int n in source)
        yield return n * 2;
}

Da Sie aber 3.5 haben, können Sie die Erweiterungsmethoden in System.Linq.Enumerable um dies zu tun:

var evens = Enumerable.Range(0, someLimit).Select(n => n * 2);

0 Stimmen

Sie haben in der Tat Recht. Ich habe nicht genau genug gelesen. Danke, dass Sie mich aufgeklärt haben.

0 Stimmen

Eigentlich ist Ihre Umsetzung nicht korrekt. Enumerable.Range() hat die Form Range(int start, int count) Der zweite Parameter sollte also '' lauten. count ' und Ihre Stopp-Bedingung sollte lauten n < start + count .

0 Stimmen

Ja, das stimmt. Ich habe das Beispiel trotzdem ein wenig verändert (immer von Null beginnend), denn dann könnte man Select um zu jedem Element einen Versatz hinzuzufügen - ein Beispiel für Orthogonalität.

6voto

JP Alioto Punkte 44283
var r = Enumerable.Range( 1, 200 );

3voto

dahlbyk Punkte 71222

Auschecken System.Linq.Enumerable.Range .

Was den zweiten Teil Ihrer Frage betrifft, was meinen Sie mit "beliebigen Listen"? Wenn Sie eine Funktion aus einer int auf die neuen Werte, können Sie das Ergebnis von Range mit anderen LINQ-Methoden verwenden:

var squares = from i in Enumerable.Range(1, 200)
              select i * i;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X