2012-02-09 9 views
0

に、私は複数の文字列変数を制御しようとしています空かない、一度空であるかどうか:高速かつエレガントな方法は、C#

私の最初のアプローチは非常に簡単です:

if(string.isNullOrEmpty(val1) && string.isNullOrEmpty(val2) && string.isNullOrEmpty(val3)) 

マイ2番目の方法はこのようになります

if(string.isNullOrEmpty(val1 + val2 + val3)) 

どちらが最速でエレガントですか? この操作を実行するオプションはありますか?

+0

最初は確かに読みやすいです。 – luketorjussen

+0

これは可能な限り速いものでなければならないのでしょうか? 99%の場合、 'val1 + val2 + val3'は十分速いです。 – Steven

+2

*最速*について:試してみてください! *エレガント*について:それはかなり主観的で、論理コードよりも短いコードが好きかどうかによって決まります。最初の例は論理的な例です。 –

答えて

2

最初は私のテストで速かったです(ちょうどしなければならなかった):6ms対70msとそれはそれぞれ10,000,000回の反復であった(したがって、あなたが大規模にこれをやっていない限り、速度差はあまり重要ではないだろう)。
とにかく、最初の方がはっきりしています。

また、それはすぐに明らかにされていませんIsNullOrEmptyの動作に依存しない、私は重要だと思いいる、(あなただけだけでなく、あなたがより良いかわからない場合はnullパラメータを渡すとArgumentNullExceptionを引き起こすことを考えるかもしれません)。

注:テストでは、すべての変数がnullに設定されていましたが、他の値に設定すると、文字列が長くなるとオプション2が長くなり、オプション1は約30ms maxになります。

また、いずれかの文字列がnullまたは空の場合は最初の文字がtrueを返します。の場合はがnullまたは空の場合にのみ2番目の文字列が戻ります。それで同じチェックではありません。

+0

パフォーマンステストデータを||で更新できますか?編集された質問のように&&に変更されましたか? Thx –

+0

平均しても差はありません。&&と||基本的に両方とも単一命令です。 – Botz3000

+0

原子ANDとORは同じ時間がかかりますが、OR連鎖 '(a || b || c || ...)は最初のTRUEで停止し、AND連鎖は最初のTRUEで停止しますFALSE。 –

1

if(string.isNullOrEmpty(val1 + val2 + val3))が私に最速

ようだ私はまたconcat

を使用するためにあなたをアドバイスだろうが、舞台裏では'+'演算子を使用しています。

私はこれが最も速いと思います。

それがNULL可能でしゃべれなかった場合、私はその長さを合計示唆し、このことについて==0 enter image description here

enter image description here

+3

'Concat'を意味しますか? – Oded

+0

@oded申し訳ありませんええ。 –

+0

'wstrcpy()'実際に引数としてマネージポインタ(正確ではない)を受け取ります。しかし、メモリの領域をコピーすることで仕事をしているので、文字列が長くなるほど、より長い 'Concat()'が実行されます。参考までに、文字列に1000文字が含まれている場合、Concatのアプローチは180(!)倍遅くなります。 –

1

方法を確認しますか?

またはそれに類するもの。

+3

これは間違いなく他の方法よりも遅くなります。 –

2

これらは同等ではありません。最初のものは、いずれかがnullであるかどうかをチェックします。 2番目は、すべてがnullであるかどうかをチェックします。あなたの心を作りなさい。

+0

私はその点を逃した。ありがとう。 – pilavust

1

1つ以上の文字列が実際にヌルまたは空であると予想される頻度に応じて、「最速」を期待します。

たとえば、val1がnullまたは空になることが多い場合、最初のオプションが最もよくなる可能性があります。彼らがまったく空でないか空でない場合、私は答えがわからないが、あなたの特定の期待に合わせていくつかのベンチマークを打ち合わせるのに5分以上かかることはありません。

(それらのいずれかがnullであるか、第二のことをやっていない空場合にも、二つのオプションが同じことをしないことに注意して、最初は真である)

0

秒1に:

if(string.isNullOrEmpty(val1 + val2 + val3)) 

if(string.isNullOrEmpty(val1) && string.isNullOrEmpty(val2) && string.isNullOrEmpty(val3)) 

(代わりに||&&に注意してください) に等しいが、私の第二のバージョンは、余分な文字列を作成し、止めるつもりはないのに対し、中間文字列を作成します。 1つの文字列が空でないとすぐにチェックします。あなたは、文字列変数の数を持っている場合は

0

は、その後、私は第1の構成を使用する方が読みやすいと思う:

if(string.isNullOrEmpty(val1) && 
    string.isNullOrEmpty(val2) && 
    string.isNullOrEmpty(val3)) 
{ 
} 

この方法で、各変数は別々に処理されるように思えるが、このコードがあります変数の1つを別の方法で扱う必要がある場合は、変更するのが簡単ではありません。

しかし、すべての文字列変数が同じ方法で扱われる場合、配列や別の種類の列挙として表現される可能性が非常に高いです。それでは、ジョン・M・ガントの提案を使用することは間違いありません。

if(myStrings.All(s => string.IsNullOrEmpty(s))) 
{ 
} 
関連する問題