質問

別の方法内で実行されているループを停止またはC#で動的にbreak文を挿入する方法はありますか?

おかげ

編集:私は、動的にメソッドインターセプトし、イベントが別のfunction.Iでトリガクラスの複数のインスタンスを持っていますと、ループを停止するようにブレークを挿入することができるようにしたいと私は、各インスタンスたびにループを停止します必要とすべてのインスタンスを管理します。ジェネリックリストにあるように、複数のインスタンスを考えてみましょう。

例:

List<myclass> objlist=new List<myclass>();

foreach(myclass obj in objlist)
{
obj.loopingfunction().BreakLoop //or something like this (assuming that the loopingfunction is already called)
}
私はdata.Whenのいくつかの巨大な量は、ユーザーがデータをインポートするユーザーストアたらループを切断したいので、

私はトリガーされたイベントを取得し、これを必要としています。しかし、私はそれネジアップSQLServerのため、複数のインスタンスからデータベースをチェックしておくことはできません。

これは、ASP.Netアプリケーションである。

役に立ちましたか?

解決

全部がシングルスレッドで実行されている場合は、

は、それがどんな意味がありません。ループが実行されている場合、他には何も同時に実行されていません。あなたが別のスレッドでループし、別のスレッドに制御する方法を実行している場合は、ループのスレッドを完全に中止するか、壊れるかどうかを判断するためにループ内でフラグをチェックし、制御方法で適切なフラグを設定しますか、ます。

アップデート:この関数は、あなたが「if」文の中でそれを破ると、使用する必要があるかどうかを示すブール値を返します。

if (myFunctionShouldBreakLoop()) break;

他のヒント

別のオプションは、ループの各反復の間にCancelEventArgsを上げることであろう。おそらく最も効率的ではないが、それにもかかわらず、別のオプションます:

    private void SomeMethod()
    {
        for (int i = 0; i <= 100000; i++)
        {
            Console.WriteLine(i);
            if (LoopIncrement != null)
            {
                CancelEventArgs args = new CancelEventArgs();
                LoopIncrement(null, args);
                if (args.Cancel)
                {
                    break;
                }
            }
        }

そして他の場所:

myObj.LoopIncrement += MyHandler;

private void MyHandler(object sender, CancelEventArgs e)
{
   if(someCondition)
   {
      e.Cancel = true;
   }
}
あなたはやや外からループを制御することができます。

この方法....

ロックプロパティに条件を持っています。

private Boolean BreakCondition
{
    get { lock(_LockObject) { return _BreakCondition; }  }
    set { lock(_LockObject) { _BreakCondition = value; }  }
}
private Boolean _BreakCondition = false;
private Object _LockObject = new Object();


if (this.BreakCondition)
{
    break;
}

どのように問題を解決するためのイテレータを使用して、降伏魔法について。

ここで役に立つかもしれない無限リスト上の記事では、

のhttp:// WWW .codethinked.com /ポスト/ 2009/02/04 /無限リスト-WITH-C-Yield.aspxする

 class Program
    {
        static void Main(string[] args)
        {
            Predicate<int> when = i => i > 100 && Console.ReadKey().KeyChar.ToString() == "0";

            foreach(var i in Numbers().BreakOn(when))
            {
                Console.WriteLine(i);
            }

            Console.ReadLine();
        }

        private static IEnumerable<int> Numbers()
        {
            var i = 0;
            while(true)
            {
                yield return i++;
            }
        }


    }

    public static class Util
    {
        public static IEnumerable<int> BreakOn(this IEnumerable<int> sequence, Predicate<int> when)
        {
            foreach(int i in sequence)
            {
                if(when(i))
                {
                    yield break;
                }
                yield return i;
            }
        }
}

私はあなたが

フラグを使用することができると思います
bool stop = false;

for(int i=0;i<num;i++) 
{
 if(stop) break;
}

短い答えは:なし。あなたは、コードをコントロールしていない場合は、ループを終了させることはできません。

あなたがコードを制御した場合は、

、あなたは協力のいくつかの並べ替えに構築することができ、それが厄介に聞こえます。たぶん、あなたは、なぜに手の込んだことができますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top