2013-05-12 17 views
7

Ho una funzione in cui voglio restituire 2 valori? È possibile?Restituisce 2 stringhe con funzione in C#

Questo è il mio codice, ma non sembra piacere che voglio tornare 2 valori

public string PlayerCards(string player1C1, string player1C2) 
     { 

      generatedCard = randomCard.Next(1, 52); 
      player1C1 = generatedCard.ToString(); 
      player1C1 = player1C1 + ".png"; 
      return player1C1, player1C2; 
     } 

Ho fatto qualche googling, ma non ho trovato quello che mi serve.

+0

Questo restituirà sempre solo due nomi di immagine di scheda? O vuoi che sia più generale, quindi potrebbe restituire più di due? In tal caso, potresti semplicemente restituire un 'Elenco '. Prenderò inoltre in considerazione la possibilità di rinominare il metodo in 'PlayerCardImageFileNames()' –

+0

Questa domanda è stata posta solo pochi giorni fa.http: //stackoverflow.com/questions/16411685/return-multiple-values-from-a-class-to -metodo – FeliceM

risposta

14

Alcune opzioni:

  • utilizzare un parametro out:

    public string PlayerCards(out string x) 
    

    Ritorna un valore, e impostare il parametro out (x in questo caso) ad un altro valore; il codice chiamante dovrà specificare un argomento con out e, una volta completata la chiamata, il chiamante sarà in grado di vedere il valore impostato nel metodo.

    (non è chiaro il motivo per cui si sta accettando i parametri a tutti,. Che non sembrano usarli per davvero)

  • Return un Tuple<string, string>

  • Creare un nuovo tipo di memorizzare i due valori insieme , assumendo che sia una combinazione significativa. Questa è sicuramente una buona scelta se i valori sono correlati in un modo che utilizzerai altrove. Ad esempio, invece di avere un metodo che restituisce una stringa per il seme di una carta e una per il valore, devi creare un tipo PlayingCard.
  • refactoring del codice in due chiamate di metodo, ognuno dei quali restituiscono un singolo valore

Non è affatto chiaro che cosa il vostro codice sta cercando di fare - il nome del metodo non è chiaro e si don' t utilizzare i parametri. Quando hai chiarito che cosa il metodo sta cercando di ottenere - per te stesso quanto per noi - la risposta potrebbe diventare più ovvia.

Vorrei anche incoraggiare l'utilizzo di variabili locali laddove appropriato. Sospetto che generatedCard debba essere una variabile locale anziché la variabile di istanza (presumibilmente) che è attualmente.

+1

Come hai risposto esaurientemente in 2 minuti ?! "Jon Skeet è così bravo, ha scritto un programma per rispondere automaticamente alle domande su SO per lui." – Devin

+1

JonSkeet non scrive risposte ... Scrive programmi e codice in SO ... L'output è in numeri di upvotes ... – VS1

+1

@VijayS - Vorrei tanto poter venire con uno scherzo parodia della Russia sovietica di Jon Skeet. Qualcosa come "... Nel codice della mente di Jon Skeet si scrive" –

10

è possibile tornare tuple: Tuple<string, string>

Tuple<string, string> t = new Tuple<string, string>(player1C1,player1C2); 

return t; 
+1

Sheesh, e ho fatto una struct o qualcosa del genere per tutto questo tempo! Devo essere vecchio ... – clamchoda

4

Una delle diverse opzioni possibili:

Creare una struttura come questa:

struct Players 
{ 
    public string Player1; 
    public string Player2; 
} 

poi usarlo nella vostra funzione come questa:

public Players PlayerCards() 
    { 
     Players p1; 
     generatedCard = randomCard.Next(1, 52); 
     p1.Player1 = generatedCard.ToString(); 
     p1.Player2 = p1.Player1 + ".png";    
     return p1; 
    } 
2

Penso che è possibile utilizzare array di stringhe ...

secondo modo è quello di utilizzare una struttura che contiene due valori di stringa o di una classe con due archi membro ,,

Guardate qui:

/// <summary> 
    /// Using struct 
    /// </summary> 
    struct twoStringValue 
    { 
     public string s1, s2; 
    } 

    public twoStringValue PlayerCards(string player1C1, string player1C2) 
    { 
     twoStringValue tsv; 
     generatedCard = randomCard.Next(1, 52); 
     tsv.s1 = player1C1 = generatedCard.ToString(); 
     tsv.s1 = player1C1 = player1C1 + ".png"; 
     return tsv; 
    } 


    /// <summary> 
    /// Using a class 
    /// </summary> 
    class TwoStringValue 
    { 
     public string str1; 
     public string str2; 
    } 

    public TwoStringValue PlayerCards(string player1C1, string player1C2) 
    { 
     TwoStringValue tsv; 
     generatedCard = randomCard.Next(1, 52); 
     tsv.str1 = player1C1 = generatedCard.ToString(); 
     tsv.str1 = player1C1 = player1C1 + ".png"; 
     return tsv; 
    } 

Buona fortuna.