2016-08-19 3 views
4

Also mache ich ein albernes Spiel in C#, aber ich bin hier ein bisschen fest.Wie gibt man 2 oder 3 Werte mit Tuple zurück?

Ich versuche entweder 2 Werte oder 3 Werte zurückzugeben, hängt von den Regeln des Spiels ab.

Ich muss wissen, wie ich verschiedene Mengen von Werten in nur einer Funktion zurückgeben kann. Wie manchmal muss ich 3 Werte und manchmal 7 Werte ... in einer Funktion zurückgeben.

Der Fehler ist mit der Variablen tuple natürlich, da ich nicht weniger als 3 Werte zurückgeben können ..

public Tuple<int, int, int> movepion(schaken.pion pion, int row, int column) 
{ 
    int row2 = row + 1; 

    //posities berekenen 
    if (pion.kleur == Color.Blue) 
    { 
     if (pion.volgnr == 0) { row++; row2++; } 
     else { row++; } 
    } 
    else 
    { 
    } 

    // declaration 
    var tuple = new Tuple<int, int>(row, column); 
    var tuple2 = new Tuple<int, int, int>(row, row2, column); 

    // what position? 
    if (pion.volgnr == 0) 
    { 
     pion.volgnr = pion.volgnr + 1; 
     return tuple2; 
    } 
    else 
    { 
     return tuple; 
    } 
} 
+0

Können Sie eine Zusammenfassung dessen, was diese geben wird verwendet? Wofür werden Tupel und Tuple2 verwendet? – sr28

+3

@Thibaut Wenn alle Werte int sind, haben Sie in Betracht gezogen, ein Array, IEnumerable oder eine Liste zurückzugeben? – Sascha

+0

@ sr28 Ich möchte eine Art Schachspiel machen, also wenn ich auf ein Pion klicke, wird es alle verschiedenen Positionen anzeigen, auf denen das Pion platziert werden kann. Ich brauche mehr Reihen oder Spalten, wenn es mehr Positionen geben kann. – Thibaut

Antwort

10

Return eine Sammlung statt einem Tuple<>

public IEnumerable<int> movepion(schaken.pion pion, int row, int column) 
{ 
    IEnumerable<int> result; 
    bool return2Items = false; //Some logic part to decide how many items to return 
    if(return2Items) 
     result = new List<int> { 1, 2 }; 
    else 
     result = new List<int> { 1, 2, 3 }; 

    return result;  
} 

Nachdem die besser auf die Kommentare zu verstehen, würde ich empfehlen, ein Objekt MoveOption und dass die Funktion zurück IEnumerable<MoveOption>

public class MoveOption 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
} 

zu erstellen Dann in Ihrer Funktion:

public IEnumerable<MoveOption> movepion(schaken.pion pion, int row, int column) 
{ 
    List<MoveOption> options = new List<MoveOption>(); 

    if(/*some condition*/) 
    { 
     options.Add(new MoveOption{ X = 1, Y = 2 }); 
    } 

    if(/*some condition*/) 
    { 
     options.Add(new MoveOption{ X = 5, Y = 7 }); 
    } 

    //Rest of options 

    return options; 
} 

Dann, wenn Sie es einen Schritt machen wollen vorwärts können Sie die Vererbung verwenden und:

public interface IMoveOptionCalcumator 
{ 
    public MoveOption Calculate(/*input*/); 
} 

public class MoveOptionX : IMoveOptionCalcumator 
{ 
    public MoveOption Calculate(/*input*/) { /*some implementation*/ } 
} 

Und in Ihrer Funktion:

public class YourClass 
{ 
    public IEnumerable<IMoveOptionCalcumator> MoveOptionCalculators { get; set; } 

    public YourClass() 
    { 
     // Initialize the collection of calculators 
     // You can look into Dependency Injection if you want even another step forward :) 
    } 


    public IEnumerable<int> movepion(schaken.pion pion, int row, int column) 
    { 
     List<MoveOption> options = new List<MoveOption>(); 
     foreach (var item in MoveOptionsCalculators) 
     { 
      var result = item.Calculate(/*input*/); 
      if(result != null) 
      { 
       options.Add(result); 
      } 
     } 
     return options; 
    } 
} 
+0

Das sieht wirklich gut aus, ich werde es versuchen und Sie wissen lassen, ob es funktioniert hat! – Thibaut

+0

@Thibaut - Überprüfen Sie, was ich mit der Schnittstelle hinzugefügt habe - Könnte mehr sein, was Sie suchen –

+0

Ich habe dieses seltsame Problem die 'Liste' in' neue Liste' gibt mir einen Fehler, ich weiß nicht warum ... und ich werde zuerst die erste Möglichkeit versuchen und ich werde versuchen, es zum nächsten Schritt zu machen, den du mir hier gegeben hast. Du hilfst mir wirklich hier draußen! – Thibaut

2

Versuchen Sie, den Rückgabetyp zu

Tuple<int, int, int?> 

Auf diese Weise ändert würden Sie haben

Wie auch immer, ich denke, es wäre am besten, die Semantik der Methode und Pro zu klären Möglicherweise haben Sie einen aussagekräftigen benutzerdefinierten Datentyp zurückgegeben.

+0

Dies gibt immer noch 3 Werte zurück - nur dass 1 davon ein 'null' ist –

+0

Das hat nicht funktioniert, ich kann den Typ' int? 'Nicht in' int' konvertieren – Thibaut

+0

benutze .Value um den int von deinem zu bekommen Nullable Geoffrey

Verwandte Themen