2013-05-12 16 views
7

Mam funkcję, w której chcę zwrócić 2 wartości? czy to możliwe?Zwróć 2 łańcuchy z funkcją w C#

To jest mój kod, ale nie wydają się podoba, że ​​chcę wrócić 2 wartości

public string PlayerCards(string player1C1, string player1C2) 
     { 

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

zrobiłem niektóre googling, ale nie mogę znaleźć to, czego potrzebuję.

+0

Czy to zawsze zwróci tylko dwie nazwy obrazów kart? A może chcesz, aby był bardziej ogólny, aby mógł wrócić więcej niż dwa? Jeśli tak, możesz po prostu zwrócić 'List '. Rozważę również zmianę nazwy metody na 'PlayerCardImageFileNames()' –

+0

To pytanie zostało zadane kilka dni temu.http: //stackoverflow.com/questions/16411685/return-multiple-values-fa--class-to -method – FeliceM

Odpowiedz

14

Niektóre opcje:

  • użyć parametru out:

    public string PlayerCards(out string x) 
    

    Return jedną wartość i ustawić parametr out (x w tym przypadku) na inną wartość; kod wywołujący będzie musiał również określić argument z out, a po zakończeniu połączenia osoba dzwoniąca będzie mogła zobaczyć wartość ustawioną w metodzie.

    (nie jest jasne, dlaczego jesteś przyjmując parametry w ogóle. Nie wydaje się naprawdę z nich korzystać)

  • zwrócić Tuple<string, string>

  • Utwórz nowy typ do przechowywania dwóch wartości razem , zakładając, że jest to znacząca kombinacja. Jest to zdecydowanie dobry wybór, jeśli wartości są powiązane w sposób, który będziesz używał gdzie indziej. Na przykład zamiast metody zwracającej jeden ciąg dla koloru karty i jednego dla wartości, należy utworzyć typ PlayingCard.
  • byłaby kodu do dwóch wywołań metod, z których każda zwracają pojedynczą wartość

To nie jest wcale jasne, co Twój kod próbuje zrobić - nazwa metody nie jest jasne i don” t używaj parametrów. Kiedy wyjaśnisz, co metoda stara się osiągnąć - dla siebie tak samo jak dla nas - odpowiedź może stać się bardziej oczywista.

Zachęcam również do użycia zmiennych lokalnych w razie potrzeby - podejrzewam, że generatedCard powinna być zmienną lokalną zamiast (przypuszczalnie) zmiennej instancji, którą aktualnie jest.

+1

Jak odpowiedziałeś na to dokładnie za 2 minuty ?! "Jon Skeet jest taki dobry, napisał dla niego program automatycznej odpowiedzi na pytania dotyczące SO". – Devin

+1

JonSkeet nie pisze odpowiedzi ... Zapisuje programy i kod w SO ... Wynik jest w liczbach upvotes ... – VS1

+1

@VijayS - Tak bardzo chciałbym móc dołączyć do parodii Jona Skeeta z radzieckiej Rosji. Coś w rodzaju "... W kodzie myślowym Jona Skeeta pisze się" –

10

można powrócić krotki: Tuple<string, string>

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

return t; 
+1

Sheesh, i robię strukturę lub coś przez cały czas! Muszę się starzeć ... – clamchoda

4

jednego z kilku możliwych opcji:

Tworzenie struct tak:

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

następnie używać go w funkcji takich jak to:

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

myślę, że można użyć tablicy ciągów ...

Drugim sposobem jest użycie struct zawierający dwie wartości ciągów lub klasy z dwu członów smyczkowy ,,

Spójrz na tutaj:

/// <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; 
    } 

Powodzenia.