2009-10-08 7 views
6

私は2つの文字列を返す必要がある関数を持っています。私はKeyValuePair <>アプローチを使用したいが、私は、私は、このオブジェクトが作成された目的を悪用だと感じKeyValuePairを返すか、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; 
} 

:私はこれを行うには、2つの異なる方法を検討してきました。

私の質問:

  1. は、この例では2つの文字列を返すために良い方法はありますか?
  2. KeyValuePairを返す際に何か問題はありますか?

答えて

20

KeyValuePairを返すと間違っ技術的何もありませんが、あなたが戻ってきている事は、概念的「キーと値」のペアではありません。それは単純なペアです。

また、Tupleを使用することもできます。これは.NET 4.0以降で使用できますが、その間にyour own structureと宣言してください。

通常、タプルを返すパラメータはoutです。特に、LINQと関数型言語構造を使用している場合は、outパラメータで作業するのは面倒です。

+0

私が返すものはKeyValuePairではないので、私はその構造体の使用に躊躇しています。事はタプルです。あなたのアイデアをありがとう。 – Guy

3

私の個人的な意見は、私は、これは戻り値が何であるかにそれがより明確になり感じ

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

だろう。

6

データが論理的に一緒に属していても論理的に他のもののキーでない場合は、それをカプセル化する新しいタイプを定義します。

一方が他方の鍵であれば、私はNameValuePairを使用します。

+0

私もこれを言うつもりでした。たとえば、人の名前を2つ表す場合は、FirstNameプロパティとLastNameプロパティを持つクラスを作成できます。これにより、将来、FullNameゲッターを作成する可能性が開かれます。 – StriplingWarrior

6

これは私の好ましい方法です。 KeyValuePairはとても冗長です。

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

haha​​ funny .. +1 – nawfal

0

は答えの様々な同様の質問があります:「クリーン・コード」の観点からHow do you return two values from a single method?

、これら2つの文字列を返すように「アウト」パラメータを使用しては悪いです。デザインをリファクタリング/クリーンアップする時間がないと仮定すると、John Kraftによって提案されたソリューションは間違いなく許容されます。

1

私は複数の出力parmsのファンではありません。最初の文字列が本当にキーでない場合は、キー値のペアを使用することも嫌です。私の提案はリスト<の文字列>を返すことです。これにより、柔軟で安定した署名が得られます。たとえば、後で3つまたは4つの文字列を返すことを決定した場合、シグネチャをサンドイッチすることなくメソッド内のロジックを更新することができます。

関連する問題