2009-10-08 7 views
6

J'ai une fonction qui doit renvoyer deux chaînes. Je l'ai examiné deux façons de le faire:Retourne KeyValuePair ou utilise une variable en C#?

string first = "this is first"; 
string second = "this is second"; 
KeyValuePair<string, string> ReturnPair() 
{ 
    return new KeyValuePair<string, string>(first, second); 
} 
string ReturnOne(out string other) 
{ 
    other = second; 
    return first; 
} 

Je voudrais utiliser le KeyValuePair <> approche, mais je sens que je suis abusant du but pour lequel cet objet a été créé.

Mes questions:

  1. Y at-il une meilleure façon de revenir 2 chaînes dans cet exemple?
  2. Y at-il un problème avec le retour du KeyValuePair?

Répondre

20

Bien qu'il n'y ait rien techniquement mal à retourner KeyValuePair, la chose que vous n'est pas retournerez sur le plan conceptuel une « clé-valeur » paire. C'est une paire simple.

Vous pouvez également utiliser un Tuple, disponible dans .NET 4.0 ou, entre-temps, déclarer your own structure.

Je conseille normalement contre out paramètres pour renvoyer des tuples. Spécialement lorsque vous utilisez LINQ et des constructions de langage fonctionnel, travailler avec out paramètres est fastidieux.

+0

Correct, la chose que je retourne n'est pas un KeyValuePair et c'est pourquoi j'hésite à utiliser cette construction. La chose est un Tuple. Merci pour vos idées. – Guy

3

Mon opinion personnelle serait

void ReturnTwo(out string one, out string two) 
{ 
    // do assignments 
} 

je me sens ce qui rend plus explicite sur ce que les valeurs de retour sont.

6

Si les données appartiennent logiquement ensemble, mais que l'une n'est pas logiquement la clé de l'autre, je définirais un nouveau type qui l'encapsule.

Si l'un est une clé de l'autre, j'utiliserais NameValuePair.

+0

J'allais le dire aussi. Si, par exemple, vous représentez les deux noms d'une personne, vous pouvez avoir une classe avec une propriété Prénom et Nom. Cela ouvre la possibilité de créer un getter FullName dans le futur. – StriplingWarrior

6

Ce serait ma méthode préférée. KeyValuePair est si prolixe.

String[] ReturnPair() 
{ 
    return new [] { first, second }; 
} 
+0

haha ​​drôle .. +1 – nawfal

0

Il y a une question similaire avec une variété de réponses: How do you return two values from a single method?

Du point de vue « propre code », en utilisant les paramètres « out » pour retourner ces deux chaînes est mauvais. En supposant que vous n'avez pas le temps de refactoriser/nettoyer votre design, la solution proposée par John Kraft est définitivement acceptable.

1

Je ne suis pas un fan des multiples paramètres de sortie. Je n'aime pas non plus utiliser une paire de valeurs clés si la première chaîne n'est pas vraiment une clé. Ma suggestion serait de retourner Liste < chaîne >. Cela fournira une signature flexible et stable. Par exemple, si vous décidez par la suite que vous souhaitez renvoyer 3 ou 4 chaînes, vous pouvez simplement mettre à jour la logique à l'intérieur de la méthode sans vous soucier de la signature.

Questions connexes