Comment retourner plus d'une valeur d'une méthode?

Je veux renvoyer les valeurs d'âge d'une méthode en C# comme suit

private int UpdateAges( int age1,  int age2,  int age3,  int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return (age1, age2, age3, age4);
}

et je peux l'utiliser comme suit

MessageBox.Show(UpdateAges(45, 30, 45, 30).ToString());
2
iEnumerable, tuple, votre propre classe ... Il y a beaucoup d'options.
ajouté l'auteur Zohar Peled, source
Si vous n'avez pas de chef d'équipe ou quelqu'un pour vous guider, je vous suggérerais de lire des livres de programmation, de lire du code open source (c #/java) et d'apprendre à écrire du code. Sur ton cas, que fais-tu du résultat? Utilisez-vous les valeurs? Ou bien les transmettre à une autre fonction? La vraie réponse nécessite plus d'informations, la réponse technique serait Tuple ou créer une "classe de détenteur" et renvoyer une classe contenant ces 4 valeurs int
ajouté l'auteur ilansch, source
Remplacez 'private int' par 'private (int, int, int, int)'
ajouté l'auteur Access Denied, source
Jetez un coup d’oeil à cette réponse .
ajouté l'auteur Emaro, source

9 Réponses

Si vous souhaitez simplement afficher le résultat dans une boîte de message, retourne une chaîne:

private string UpdateAges(int age1, int age2, int age3, int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return "age1 = " + age1 + ", age2 = " + age2 + ", age3 = " + age3 + ", age4 = " + age4;
}

MessageBox.Show(UpdateAges(45, 30, 45, 30));

Si vous souhaitez également mettre à jour les valeurs d'âge après la boîte de message affichée, ajoutez le mot-clé ref pour chaque argument.

private string UpdateAges(ref int age1, ref int age2, ref int age3, ref int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;
    return "age1 = " + age1 + ", age2 = " + age2 + ", age3 = " + age3 + ", age4 = " + age4;
}

MessageBox.Show(UpdateAges(ref age1, ref age2, ref age3, ref age4));
4
ajouté

Essaye ça:

private Tuple UpdateAges( int age1,  int age2,  int age3,  int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;

    return Tuple.Create(age1, age2, age3, age4);
}

See also: about C# 7 new included Tuples syntax

4
ajouté

Refer this - How to Return Multiple Values From a Function in C#

Il y a peu de façons de renvoyer plusieurs valeurs d'une fonction.

  1. Reference parameters
  2. Output parameters
  3. Returning an Array
  4. Returning an object of class/struct type -- This is way we mostly follow
  5. Returning a Tuple

Ref- From C# 7, you return more than one value from a method thanks to tuple types and tuple literals.

(int, int, int, int) UpdateAges(int age1,  int age2,  int age3,  int age4)//tuple return type
{   
    age1++;
    age2++;
    age3++;
    age4++;

    return (age1, age2, age3, age4);
}

Utilisation:

var values = UpdateAges(1, 2, 2, 3);

Utilisation des tuples:

private Tuple UpdateAges(int age1, int age2, int age3, int age4)
{
    age1++;
    age2++;
    age3++;
    age4++;

    return Tuple.Create(age1, age2, age3, age4);
}
3
ajouté
Les tuples nommés sont encore plus sucrés. blogs.msdn.microsoft .com/dotnet/2017/03/09/& hellip;
ajouté l'auteur MickyD, source

Bien que vous puissiez utiliser Tuple ou ref pour obtenir ce que vous voulez, je ne suis pas sûr que ce soit la meilleure pratique dans votre cas.

Vous pouvez encapsuler toute votre logique avec une classe dédiée:

public class Ages
{
    public int Age1 { get; set; }
    public int Age2 { get; set; }
    public int Age3 { get; set; }
    public int Age4 { get; set; }

    private void UpdateAges()
    {
        this.Age1++;
        this.Age2++;
        this.Age3++;
        this.Age4++;
    }

    private string ToString() => 
        $"Age1 = {this.age1}, Age2 {this.age2}, Age3 = {this.age3}, Age4 {age4}";
}

De cette façon, tout ce qui concerne la gestion des âges se trouve au même endroit et peut être réutilisé dans votre code.

Vous pouvez bien sûr aller plus loin et remplacer les propriétés "age" par un List ou un tableau.

public class Ages
{
    public int[] Ages { get; }

    public Ages (params int[] ages)
    {
        this.Ages = ages;
    }

    private void UpdateAges() =>
        for (int i = 0; i < this.Ages.Length; i++) this.Ages[i]++;

    private string ToString() =>  
        string.Join(", ", 
            this.Ages.Select((age, i) => $"Age{i} = {age}"));
}


var ages = new Ages(31, 40, 12, 18);
ages.UpdateAges();
MessageBox.Show(ages.ToString());
1
ajouté

Avec le paramètre de méthode params , vous pouvez passer n'importe quel nombre de paramètre retournant dans un Enumerable, un tableau de listes, etc.

Avec un appel flexible Incrément (1,2,3), Incrément (1,2) , Incrément (myIntArray) , Incrément (1) `..

static IEnumerable Increment(params int[] args)
{
    return args.Select(x => x + 1);
}

Permettre un appel comme:

var result = Increment(45, 30, 45, 30);
// {46, 31, 46, 31}

Pour l'affichage, vous pouvez utiliser rejoindre la chaîne . string.Join (",", résultat)

static void Main(string[] args)
{
    var uniqueValue = 99;
    var multipleValues = new[] { 1, 2, 6 };


    var uvResult = Increment(uniqueValue);
    var mvResult = Increment(multipleValues);


    Console.WriteLine($"uniqueValue = {uniqueValue}  => {string.Join(", ",uvResult)}");
    Console.WriteLine($"multipleValues = {string.Join(", ",multipleValues)}  => {string.Join(", ",multipleValues)}");

}
1
ajouté
@ Maro, oui je sais. code op UpdateAges (45, 30, 45, 30) sonne immédiatement cette cloche. J'ai juste oublié de l'inclure dans la réponse. Merci pour ça. Mettez à jour la réponse pour le rendre clair
ajouté l'auteur Drag and Drop, source
Vous pouvez même appeler Increment (1, 2, 3, 4);
ajouté l'auteur Emaro, source

Vous pouvez résoudre ce problème de plusieurs manières.

  1. Using Tuple

    private Tuple UpdateAges(int age1, int age2, int age3, int age4)
    {
        return Tuple.Create(++age1, ++age2, ++age3, ++age4);
    }
    
  2. Using List

    private List UpdateAges(int age1, int age2, int age3, int age4)
    {
        return new List(){++age1, ++age2, ++age3, ++age4};
    }
    
  3. Using Arrays

    private int[] UpdateAges(int age1, int age2, int age3, int age4)
    {
        var results = new int[4];
        results[0] = ++age1;
        results[1] = ++age2;
        results[2] = ++age3;
        results[3] = ++age4;
    }
    
  4. Using Reference parameters

    private List UpdateAges(ref int age1, ref int age2, ref int age3, ref int age4)
    {
        age1++;
        age2++;
        age3++;
        age4++;
    }
    
1
ajouté

Vous pouvez également utiliser 'out int' comme ceci.

private void UpdateAges(int IAge1, int IAge2, int IAge3, int IAge4, out int OAge1, out int OAge2, out int OAge3, out int OAge4)
{
    OAge1 = IAge1++;
    OAge2 = IAge2++;
    OAge3 = IAge3++;
    OAge4 = IAge4++;
}

lorsque vous appelez cela, vous devez utiliser comme ceci.

UpdateAges( Age1, Age2, Age3, Age4, out Age1, out Age2, out Age3, out Age4 );
1
ajouté
Cette solution est un complexe inutile. void Update (out int i) => i ++; suffirait (par exemple, vous avez juste besoin de la variable out, pas besoin de doubler la quantité de paramètres).
ajouté l'auteur Emaro, source

Comment le faire avec une liste:

private static List UpdateAges(int age1, int age2, int age3, int age4)
{
    return new List { ++age1, ++age2, ++age3, ++age4 };
}

Puis appelle ça comme ça:

Console.WriteLine(string.Join(",", UpdateAges(1, 2, 3, 4)));

OK, espérons que ça aide.

1
ajouté

1. Utilisation de:

static void UpdateAges(out int age1, out int age2)
{
    age1++;
    age2++;
}

int age1;
int age2;
UpdateAges(out age1, out age2);
Console.WriteLine(age1);
Console.WriteLine(age2);

2. Utilisation de KeyValuePair:

static KeyValuePair UpdateAges(age1, age2)
{
    return new KeyValuePair(age1++, age2++);
}

int age1;
int age2;
var pair = GetTwoNumbers(age1,age2);
Console.WriteLine(pair.Key);
Console.WriteLine(pair.Value);

3. Using Tuple:

static Tuple UpdateAges(age1, age2)
{
    return new Tuple(age1++, age2++);
}

int age1;
int age2;
var tuple = UpdateAges(age1,age2);
int a = tuple.age1;
int b = tuple.age2;
0
ajouté
@Emaro C'est l'habitude de vieillir comme la clé et age2 comme la valeur
ajouté l'auteur Kamrul Hasan, source
Un KeyValuePair ne doit pas être utilisé comme un tuple. Comment age1 peut-il être la clé pour age2?
ajouté l'auteur Emaro, source
Je comprends comment ça marche. Cependant, c’est une mauvaise utilisation sémantique que je considère comme une mauvaise pratique. La valeur tuples (int a1, int a2) serait un bien meilleur choix.
ajouté l'auteur Emaro, source