2017-11-08 10 views
1

2つのnull可能な列挙型がありますが、その値を2つの通常の列挙型と比較したいと思います。 null可能なenumに値がない場合、比較をtrueに評価します。これは私の論理がこれまでのように見えるものです:nullable型に値があるかどうかを調べる最も簡単な方法はありますか?そうであれば、nullable型以外の型の値と値を比較するにはどうすればよいですか?

if (!nullableEnumOne.HasValue || nullableEnumOne.Value == regularEnumOne) 
    && (!nullableEnumTwo.HasValue || nullableEnumTwo.Value == regularEnumTwo) 
{ 
    //do something 
} 

私が紛失しているこのロジックを単純化する方法はありますか?

+1

括弧が一致しません。コンパイルして、あなたの意図を正しく反映するように修正してください。 –

+1

@Dave:OPは 'nullableEnumOne'と' nullableEnumTwo'を全く比較しようとしていません。 –

+0

@JonSkeetああ、非常に有効なポイント。謝罪は、私は質問 – Dave

答えて

13

それはおそらくnull-coalescing operatorあなたはに対して比較している値を「デフォルト」に使用する最も簡単です:

if ((nullableEnumOne ?? regularEnumOne) == regularEnumOne && 
    (nullableEnumTwo ?? regularEnumTwo) == regularEnumTwo) 

またはあなたの現在のコードに固執する...またはnullの代わりに、負を使用と比較条件:

if ((nullableEnumOne == null || nullableEnumOne.Value == regularEnumOne) 
    && ((nullableEnumTwo == null || nullableEnumTwo.Value == regularEnumTwo)) 

またはわずかに不気味、あなたは真のヌルケースを作るためにnull合体演算子を使用して、ヌル条件演算子でEqualsを呼び出すことができます。

if ((nullableEnumOne?.Equals(regularEnumOne) ?? true) 
    && (nullableEnumTwo?.Equals(regularEnumTwo) ?? true)) 

これらのうちのどれもは大量にであり、判読可能である。私はヘルパーメソッドを書こうと思うので、次のように書くことができます:

if (NullOrEqual(nullableEnumOne, regularEnumOne) && 
    NullOrEqual(nullableEnumTwo, regularEnumTwo)) 
+1

すべてがNullOrEqual ブール { のpublic static 'パブリック静的クラスNullableExtensions :-)拡張メソッドを持つ方が良いする前に何百回もやりました(このT?nullable、T compareTo)T:struct { return nullable == null || nullable.Value.Equals(compareTo); } } ' –

+1

@ZoharPeled:わかりません - おそらく非常に限られた範囲ですが、私は一般的に有用なコードの拡張メソッドを予約する傾向があります。これはかなり具体的です。 –

+1

私はそれが意見の問題だと思います。私にとっては、このような方法がほとんど拡張メソッドであるように頼んでいるようです。 IMHO、 'NullOrEqual 'は、通常の方法として、extestionメソッドとしてはるかに読みやすくなっています。また、単一のプロジェクトやアセンブリに固有のものであっても、拡張メソッドを使用する傾向があります。メソッドを複数のクラスで同じ型に使用する必要があるとすぐに、私は通常、それを拡張メソッドの良い候補とみなします。 –

関連する問題