2016-08-23 12 views
1

C#はブール式の値に応じて2つの値のいずれかを返すconditional operator (?:)を提供します。例えばC#条件演算子 - 条件が真である場合にメソッドを呼び出すelse do nothing do

condition ? first_expression : second_expression;

私の質問は、我々は条件が真のとき、メソッドを呼び出すために同じ構文を使用することができますか?条件が偽の場合は何もしないでください。

public void Work(int? val) 
{ 
    var list = new List<int>(); 

    //ofcourse line below doesn't work 
    //but is it possible to call method when condition is true and else do nothing 

    val.HasValue? list.Add(val.value) : else do nothing 
} 
+6

なぜあなたはそれを望みますか?単純な 'if'を使用してください。 –

+0

はい、あなたはそれを行うことができます.... –

+2

@TylerNicholsそれはあなたがそれを取り除く方法を見て興味深いでしょう...(と使用することはできません '?:'で始まるものに結果を割り当てることなく) –

答えて

2

条件の評価によって異なる値を返すためにC#条件演算子が使用されます。それは、あなたがあなたの質問にしようとしている方法で使用するのに慣れていないことを意味します。なお、この使用することが好きでなければならない:iがより小さい(又は等しい)であれば3あれば3、又はtestが1に等しくなる

int test = i > 3 ? 0 : 1; 

test 0等しくなりますが何をすべきか3.

より大きいあなたは(あなたはまだ道で1行で書くことができます)定期ifステートメントを使用する必要がありますしたい:

if (val.HasValue) list.Add(val.value); 
+0

ありがとうございました。それは本当に良い情報でした。条件付き演算子で任意のメソッドを呼び出すことができるかどうかをより一般的な方法で質問しました。しかし、この特定のシナリオのために私は追加する前に、値がnullであるかどうかをチェックリストに拡張メソッドを作成することになった '公共の静的な無効AddIfNotNull (このIListのリスト、TValue val)で { (ヴァル!= null)の { リストの場合.Add(val); } } – LP13

5

?:も過去に三項演算子と呼ばれています。ターナーリー、3人。これなら、これをしてください。

2つの式があります。これは、これを行う場合。これはまさにifステートメントのポイントです。あなたはそれが設計されていない構成にあなたのケースを合わせようとしています。 しないでください

は仕事のために正しい動作を使用します。

if(val.HasValue) 
{ 
    list.Add(val.value) 
} 
+0

OPの名前はrightです。 *条件付き*演算子であり、3項演算子ではありません。 3つのオペランドを受け入れるという点で、+ - * /などのようにすべてのバイナリ演算子です。* a * 3進演算子です。 – Servy

+0

@Servyは、VS2010の後に[名前を変更した]ようです(https://msdn.microsoft.com/en-us/library/zakwfxx4%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396)。私はまだ同義語を使用しています – Jonesopolis

+0

そのページはそれを条件付き演算子と呼んでいます。名前が変わったとは言わない。 – Servy

2

を条件付き/三項演算子は値を返すことになっていると、非常に特定の値が戻ってどこかに割り当てる必要があります。

だから、そうすることができます。そうです。しかし、それは悪いデザインにつながるだろう。通常の場合

、1はこれを行うだろうことは:条件が真とDoRest(にレンダリングするとき

int x = (a > b) ? a : b; 

さて、)AddToListを(仮定することができます)は、ご希望の方法であり、あなたがあれば呼び出したいメソッドです条件は偽になります。上記の場合には

は、あなたがこのような何かをやって終わるだろう:

int result = val.HasValue? AddToList(val.value) : DoRest(); 

は今、あなたは(あなたがいることを必要とする場合)と呼ばれた1見つけ出すためresultに依存する必要があり、それはですあまり表現力がなく、適切なコード設計を指していません。

あなたが少しより冒険あなたがで終わるだろう取得する場合:いずれの場合では

var actionToInvoke = val.HasValue ? (Action)AddToList: (Action)DoRest; 
actionToInvoke(); 

、これらのリードに非常に読みやすいコードのどれも。

したがって、単純なif(val.HasValue)を貼り付けるのが最も簡単な方法です。

1

null条件付き演算子が動作する仕組みは、それに割り当てる変数の値を返さなければならないということです。だから、文字列の値か、void以外の何かをしたいのであれば、問題なしでメソッドを呼び出すことができます。しかし、voidメソッドを呼び出すには、デリゲートを使用できます。

delegate void DelMethod(); 

     void Method() { } 

     void MethodTwo() { } 

     private void MyMethod() 
     { 

      DelMethod x; 

      x = condition == true ? (DelMethod)Method : (DelMethod)MethodTwo; 

     } 
+0

コードオンリーの回答は禁止されていませんが、これは群衆調達ではなく、Q&Aコミュニティであることを理解してください。また、通常OPがコードを回答として理解していれば、彼自身の上に同様の解決策を提示し、最初に質問を投稿しなかったでしょう。同様の原則は、コードが馴染みにくい今後の読者にも適用されます。そのように、あなたの答えやコードに文脈を提供してください。 – XenoRo

+0

@AlmightyR申し訳ありません。私はそれが簡単なコードを理解するのは簡単だと思った。それにもかかわらず編集されました。 –

+0

ああ、間違ってはいけません。そうです! (理解しやすい)しかし、それはプログラミング言語、原理、および/または使用されている方法論に精通している人にのみ当てはまります。みんなではなく、少なくともコードの簡単な説明を提供すれば、できるだけ多くの人にはならない。これは、コードオンリーの回答がSOで禁じられていないが、基本的なコードであっても依然として推奨されていない多くの理由の1つです。 =)---とにかく、私はあなたがより良い説明をすることができたと思うが、それは良いスタートだ。 +1の努力。 – XenoRo