2

各行の前になくても、ステートメントブロックの各行に対して条件が真であることを確認することは可能if (condition)ですか?

例えば:

if (condition)
{
    DoSomething();
    DoSomethingElse();
    DoAnotherThing();
}

ある時点で、別のバックグラウンド プロセスが実行されるcondition前に false に設定されDoSomethingElse()ている可能性があります。基本的に、効率的で簡単な言い方を探しています。

if (condition) DoSomething();
if (condition) DoSomethingElse();
if (condition) DoAnotherThing();

実際には、特定のフラグが変更された場合に破棄したいのは、1 回実行される長いコード ブロックです。

この種のコードを引き締める最良の方法は何ですか。

4

7 に答える 7

6

いいえ - 条件が 1 回チェックされてから、ブロック全体が実行されます。別のオプションは、ブロックに救済策を挿入することです。

if (condition)
{
    DoSomething();
    if(!condition) return;
    DoSomethingElse();
    if(!condition) return;
    DoAnotherThing();
}

別の方法は、関数をパラメーター化してループに入れることができる場合です。

foreach (varmyParam in parameters)
{
    if(condition)
       DoSomething(myParam);
}

編集

もう少し考えた後、これが最良の選択肢かもしれません:

List<Action> funcs = new List<Action> {DoSomething, DoSomethingElse, DoAnotherThing};
foreach( Action a in funcs)
{
   if(condition) a();
}

それには、すべてのメソッドが同じ署名を持っている必要があります (あなたの場合voidはパラメーターなしで戻ります) が、少しきれいです。

于 2013-08-29T14:45:34.990 に答える
0

多分このように:

int step = 1;
bool running = true;

while (running && condition) {
   switch (step) {
      case 1: DoSomething(); break;
      case 2: DoSomethingElse(); break;
      case 3: DoAnotherThing(); break;
      // and maybe other cases
      default: running = false; break; // AFAIK you can't break out of both switch and while (without labels)
   }

   step = step + 1;
}
于 2013-08-29T14:56:18.540 に答える
0

デリゲートメソッドでラップして、条件を指定してメソッドを呼び出し、それがtrueの場合に実行するメソッドを呼び出すことができます。関数のリストでそれを行うこともできます:

void Main()
{
   DoSomething();
   DoIf(true, DoWork1);
   DoIf(false, DoWork2);
   var MyFunctions = new List<MyFunction>() { DoWork1, DoWork2 };

   foreach(var func in MyFunctions) {
       DoIf(someBoolCondition == 0, func);
   }
}

public delegate void MyFunction();

void DoSomething() {
   Console.WriteLine("Always");
}

public void DoWork1() {
    Console.WriteLine("Only if it was true");
}

public void DoWork2() {
   Console.WriteLine("Only if it was true");
}

void DoIf(bool condition, MyFunction function) {
   if(condition) {
       function();
   }
}

出力:

Always
Only if it was true
于 2013-08-29T14:57:27.133 に答える
0

でラムダを使用できますActionが、これは実際には入力をあまり節約しません。

Action<Action> exec = a => { if (condition) a(); };

exec(DoSomething);
exec(DoSomethingElse);
exec(DoAnotherThing);
于 2013-08-29T15:07:33.527 に答える
-1

複数のスレッドを使用しているようです.1つのスレッドが作業を行い、別のスレッドがリクエストをキャンセルして作業を行います。

その場合は、何らかのフラグを設定するのではなく、作業を行っているスレッドを中止することを検討する必要があります。http://msdn.microsoft.com/en-us/library/System.Threading.Thread.Abort.aspxを確認してください

これは非常に単純で、フラグをワーカー スレッドからチェックアウトし続けます。

Thread.Abort に関する 1 つの大きな前提は、タスクの途中でワーカー メソッドを中止しても安全であるということです。フラグ チェックの現在のソリューションでは、残りの作業を放棄する前に、現在実行中のメソッドを完了することができます。

于 2013-08-29T15:33:09.860 に答える