2 Stimmen

Benötige Hilfe bei der Beendigung der aufgeschobenen Ausführung

Das folgende Snippet gibt 1 bis 10 auf der Konsole aus, wird aber erst beendet, wenn die Variable 'i' den Wert int.MaxValue erreicht. TIA für das Aufzeigen, was ich vermisse.

class Program 
{
    public static IEnumerable<int> GetList() 
    {
        int i = 0;
        while (i < int.MaxValue)
        {
            i++;
            yield return i;
        }
    }

    static void Main(string[] args)
    {
        var q = from i in GetList() // keeps calling until i reaches int.MaxValue
                where i <= 10
                select i; 

        foreach (int i in q)
            Console.WriteLine(i);
    }
}

5voto

Nescio Punkte 26799

Sie könnten es versuchen:

        var q = GetList ().TakeWhile ((i)=> i <=10);

5voto

Steven Punkte 157957

Die Abfrage, die Sie in Main weiß nichts über die Reihenfolge Ihrer GetList Methode, und sie muss jeden Wert dieser Liste mit dem Prädikat i <= 10 . Wenn Sie die Verarbeitung früher beenden möchten, können Sie die Funktion Take Erweiterungsmethode oder verwenden Sie die TakeWhile Erweiterungsmethode:

foreach (int i in GetList().Take(10))
    Console.WriteLine(i);

foreach (int i in GetList().TakeWhile(x => x <= 10))
    Console.WriteLine(i);

2voto

jrista Punkte 31522

Ihre Iteratoren Grenzen sind 0 bis Int32.MaxValue, so wird es den gesamten Bereich verarbeiten. Iteratoren sind nur intelligent genug, um nicht vorzitieren. die Ergebnisse des Datenbereichs, den Sie für die Iteration vorsehen. Sie sind jedoch nicht klug genug, um zu wissen, wann der Code, der sie verwendet, nicht mehr benötigt, es sei denn, Sie sagen es ihm (d. h. Sie brechen aus einer foreach-Schleife aus):

public static IEnumerable<int> GetList(int upperBound) 
{
    int i = 0;
    while (i < upperBound)
    {
        i++;
        yield return i;
    }
}

Sie könnten dem Iterator auch explizit mitteilen, dass Sie nur die ersten 10 Ergebnisse durchlaufen wollen:

var numbers = GetList().Take(10);

1voto

p.campbell Punkte 94960

Erwägen Sie die Verwendung der LINQ-Erweiterungsmethode .Take() mit Ihrem Argument, anstatt es in Ihrem where Klausel. Mehr über Take .

 var q = from i in GetList().Take(10)
                select 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