C#でメソッド内ループを止めます
-
20-09-2019 - |
質問
別の方法内で実行されているループを停止または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;
}
短い答えは:なし。あなたは、コードをコントロールしていない場合は、ループを終了させることはできません。
あなたがコードを制御した場合は、、あなたは協力のいくつかの並べ替えに構築することができ、それが厄介に聞こえます。たぶん、あなたは、なぜに手の込んだことができますか?