2017-02-01 11 views
0

Ich habe eine Methode, die Summen und Ausgaben es mit out. Meine Methode sieht wie folgt aus:Verwendung in einer rekursiven Funktion in C#

public void MyMethod(int page, string city, out int citySum) 
{ 
    citySum = 0; 

    for(int i = 0; i < 50; i++) 
    { 
     citySum++; 
    } 

    if(page < 15) 
    { 
     MyMethod(page + 1, city,out citySum); 
    } 
} 

Was mich verwirrt ist möchte ich aus citySum als insgesamt. Aber mit dieser Konfiguration wird citySum bei jedem rekursiven Schritt Null. Wie kann ich den Wert citySum halten und an den nächsten rekursiven Schritt übergeben?

+3

warum 'for (int i = 0; i <50; i ++) {citySum ++;}' und nicht 'citySum + = 50; '? –

+9

Beenden Sie die Verwendung von out param und geben Sie die Ganzzahl anstelle von void aus Ihrer Methode zurück. –

+0

@DawidRutkowski Ich muss Param verwenden, es ist eine Voraussetzung. – jason

Antwort

7

Durch einfaches eine neue Variable Einführung das Ergebnis vorübergehend

public void MyMethod(int page, string city, out int citySum) 
{ 
    citySum = 0; 

    for(int i = 0; i < 50; i++) 
    { 
     citySum++; 
    } 

    if(page < 15) 
    { 
     int tempSum = 0; 
     MyMethod(page + 1, city, out tempSum); 
     citySum += tempSum; 
    } 
} 

zu halten oder mit ref statt

public static void MyMethod(int page, string city, ref int citySum) 
{ 
    for(int i = 0; i < 50; i++) 
    { 
     citySum++; 
    } 

    if(page < 15) 
    { 
     MyMethod(page + 1, city, ref citySum); 
    } 
} 

Working example on Fiddle


Or

public static int MyMethod(int page, string city) 
{ 
    int citySum = 0; 

    for(int i = 0; i < 50; i++) 
    { 
     citySum++; 
    } 

    if(page < 15) 
    { 
     citySum += MyMethod(page + 1, city); 
    } 

    return citySum; 
} 

Working example on Fiddle

+0

Ich weiß nicht, wie ich Ihre Version der Rückgabe des Ergebnisses direkt verpasst habe, als ich meine Antwort geschrieben habe! Sollte mich nicht so sehr in den OP-Code einbinden. Auch diese Version 3 ist die beste Antwort. – TheLethalCoder

+0

Eine Frage: Wäre citysum nicht null, wenn ich es im nächsten rekursiven Schritt anrufe? – jason

+0

Danke übrigens für die Antwort – jason

4

Verwenden Sie nicht und senden Sie das int aus der Methode: direkt das Ergebnis zurück. Verwenden Sie auch += 50 macht den Code sauberer.

public int MyMethod(int page, string city, int citySum = 0) 
{ 
    //for (int i = 0; i < 50; i++) 
    //{ 
    // citySum++; 
    //} 

    citySum += 50; 

    if (page < 15) 
    { 
     return MyMethod(page + 1, city, citySum); 
    } 

    return citySum; 
} 

Beachten Sie, dass hier citySum-0 voreingestellt, kann aber durch den anrufenden Methode eingestellt werden. Zur Umgehung dieses könnten Sie eine public Methode verwenden, der dieses aussetzt, indem es ändert private zu sein:

public int MyMethod(int page, string city) 
{ 
    return MyMethod(page, city, 0); 
} 

private int MyMethod(int page, string city, int citySum) 
{ 
    //... 
Verwandte Themen