2009-10-08 7 views
6

Tengo una función que necesita devolver dos cadenas. He pensado en dos maneras diferentes de hacer esto:¿Devuelve KeyValuePair o usa la variable de salida 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; 
} 

me gustaría usar el <> enfoque KeyValuePair pero siento que estoy haciendo mal uso de la finalidad para la que se creó este objeto.

Mis preguntas:

  1. ¿Hay una mejor manera de volver 2 cuerdas en este ejemplo?
  2. ¿Hay algún error al devolver KeyValuePair?

Respuesta

20

bien no hay nada técnicamente malo en volver KeyValuePair, la cosa va a devolver no es conceptualmente un "valor clave" par. Es un par simple.

Como alternativa, puede usar un Tuple, que está disponible en .NET 4.0 o, mientras tanto, declare your own structure.

que normalmente consejos contra out parámetros para el retorno de tuplas. Especialmente cuando utiliza LINQ y construcciones de lenguaje funcional, trabajar con los parámetros out es tedioso.

+0

correcta, lo que estoy de vuelta no son un KeyValuePair y por eso estoy indeciso en el uso de esa construcción. La cosa es una Tuple. Gracias por tus ideas – Guy

3

Mi opinión personal sería

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

me siento esto hace que sea más explícito en lo que son los valores de retorno.

6

Si los datos pertenecen lógicamente juntos, pero uno no es, lógicamente, la clave de la otra, yo definiría un nuevo tipo que lo encapsula.

Si uno es una clave para la otra, me gustaría utilizar NameValuePair.

+0

Iba a decir esto también. Si, por ejemplo, estás representando los dos nombres de una persona, podrías tener una clase con una propiedad FirstName y LastName. Esto abre la posibilidad de crear un getter FullName en el futuro. – StriplingWarrior

6

Esta sería mi método preferido. KeyValuePair es muy detallado.

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

jaja gracioso .. +1 – nawfal

0

Hay una pregunta similar con una variedad de respuestas: How do you return two values from a single method?

Desde la perspectiva "-código limpio", utilizando los parámetros "fuera" para devolver estas dos cadenas es malo. Suponiendo que no tiene tiempo para refactorizar/limpiar su diseño, la solución propuesta por John Kraft es definitivamente aceptable.

1

No soy un fan de los múltiples parms de salida. Tampoco me gusta utilizar un par de valores clave si la primera cadena no es realmente una clave. Mi sugerencia sería devolver Lista <cadena>. Esto proporcionará una firma flexible y estable. Por ejemplo, si más adelante decide que desea devolver 3 o 4 cadenas, puede actualizar la lógica dentro del método sin modificar la firma.

Cuestiones relacionadas