Wie kann man in C # 7 mehrere Werte zurückgeben? [geschlossen]


72

Ist es möglich, mehrere Werte von einer Methode nativ zurückzugeben?



3
Der schöne Weg ist, ein classoder ein structHalten der "Mehrfachwerte" zu definieren und eine Instanz von einem dieser Werte zurückzugeben. Sie werden feststellen, dass dieser Ansatz am besten skaliert. Tupel sind eine schlechte Idee, da sie zu "Freiform" sind, wenn Sie meine Bedeutung verstehen.
Bathseba

4
@Bathsheba: In einer öffentlichen API vielleicht (noch nicht genug Zeit, um zu beurteilen) - aber innerhalb einer Klasse oder sogar einer Versammlung denke ich, dass Tupel wirklich praktisch sein werden. Warum sollten Sie sich die Mühe machen, Ihren eigenen ganzen Typ zu erstellen, um ihn zu pflegen, wenn Sie nur eine Sammlung von Variablen an ein oder zwei Stellen möchten?
Jon Skeet

1
Weil sich "nur" dazu entwickelt, andere Anforderungen erfüllen zu müssen. Für mich werden Tupel von Leuten, die genau zu träge sind, um ihren eigenen Typ zu kreieren, gründlich missbraucht.
Bathsheba

2
@Bathsheba: Also missbrauche sie nicht und rate gegen ihren Missbrauch. Verwenden Sie sie am richtigen Ort - aber lehnen Sie sie nicht vollständig ab, nur weil sie missbraucht werden können. Jede Funktion kann missbraucht werden, und viele sind es auch.
Jon Skeet

Antworten:


169

Was meinst du mit nativ ?

C # 7 verfügt über eine neue Funktion, mit der Sie dank Tupeltypen und Tupelliteralen mehr als einen Wert von einer Methode zurückgeben können .

Nehmen Sie zum Beispiel die folgende Funktion:

(string, string, string) MyCoolFunction() // tuple return type
{   
    //...        
    return (firstValue, secondValue, thirdValue);
}

Welches kann so verwendet werden:

var values = MyCoolFunction();
var firstValue = values.Item1;
var secondValue = values.Item2;
var thirdValue = values.Item3;

Oder mithilfe der Dekonstruktionssyntax

(string first, string second, string third) = MyCoolFunction();

//...

var (first, second, third) = MyCoolFunction(); //Implicitly Typed Variables

Nehmen Sie sich etwas Zeit, um die Dokumentation zu lesen . Sie enthält einige sehr gute Beispiele (diese Antwort basiert auf ihnen!).


4
Es ist auch erwähnenswert, dass Sie auch die Rückgabewerte benennen können, wodurch Sie sie in beliebiger Reihenfolge dekonstruieren können.
Jim Aho

9
Wenn Sie den Fehler haben Predefined type 'System.ValueTuple´2´ is not defined or imported, schauen Sie hier: stackoverflow.com/a/38383064/789423
Beauty

1
Eine Sache, die oben nicht erwähnt wurde und die mich eine Weile sehr verwirrt hat, ist, dass die Dekonstruktionssyntax so verwendet werden kann, dass die von einer Methode zurückgegebenen Tupelelemente Feldern zugewiesen werden können, die zuvor im Programm definiert wurden. Wenn die Methode innerhalb einer anonymen Methodendefinition aufgerufen wird, werden möglicherweise einige Tupelelemente Feldern zugewiesen, die außerhalb der anonymen Methode definiert sind, und einige Felder, die innerhalb der anonymen Methode definiert sind.
RenniePet

Ich glaube, mit "nativ" meinte er, dass es sofort funktioniert - im Standard-Framework enthalten. Was es manchmal tut . Siehe diesen Beitrag: stackoverflow.com/questions/38382971/…
nardnob

Und die Dekonstruktion kann noch weiter verkürzt werden:var (first, second, third) = MyCoolFunction();
zmechanic

25

Sie suchen nach Tupeln. Dies ist ein Beispiel:

static (int count, double sum) Tally(IEnumerable<double> values)
{
    int count = 0;
    double sum = 0.0;
    foreach (var value in values)
    {
        count++;
        sum += value;
    }
    return (count, sum);
}

...

var values = ...
var t = Tally(values);
Console.WriteLine($"There are {t.count} values and their sum is {t.sum}");

Beispiel gestohlen von http://www.thomaslevesque.com/2016/07/25/tuples-in-c-7/


-2

Sie können auch Folgendes implementieren:

public class Program
{
    public static void Main(string[] args)
    {

        var values=GetNumbers(6,2);
        Console.Write(values);


    }

    static KeyValuePair<int,int> GetNumbers(int x,int y)
    {
        return new KeyValuePair<int,int>(x,y);
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.