のようにする方法はありC/C#
ますか?
例 (C# スタイル)
for (int i = 0; i < 100; i++)
{
if (i == 66)
break;
}
のようにする方法はありC/C#
ますか?
例 (C# スタイル)
for (int i = 0; i < 100; i++)
{
if (i == 66)
break;
}
短い答えはノーです。通常、同じ機能を表現するには、高階関数を使用します。さまざまなパターンに対応して、これを可能にする関数がいくつかあります (したがって、必要なものを正確に説明すると、誰かがより良い答えをくれるかもしれません)。
たとえば、tryFind
function は、指定された述語が を返すシーケンスから最初の値を返しますtrue
。これにより、次のように記述できます。
seq { 0 .. 100 } |> Seq.tryFind (fun i ->
printfn "%d" i
i=66)
実際には、高レベルのロジックを表現していて、対応する関数がある場合は、これが最善の方法です。のようなものを本当に表現する必要がある場合break
は、再帰関数を使用できます。
let rec loop n =
if n < 66 then
printfn "%d" n
loop (n + 1)
loop 0
break
より風変わりなオプション (それほど効率的ではありませんが、DSL には適しているかもしれません) は、 andを記述できる計算式を定義できるというものですcontinue
。ここに例がありますが、私が言ったように、これは効率的ではありません。
これは本当に醜いですが、私の場合はうまくいきました。
let mutable Break = false
while not Break do
//doStuff
if breakCondition then
Break <- true
done
これは、ループが少なくとも 1 回実行されることを保証するため、do-while ループに役立ちます。
もっとエレガントな解決策があることを願っています。スタックオーバーフローが怖いので、再帰的なものは好きではありません。:-(
while ループに変更する必要があります。
let (i, ans) = (ref 0, ref -1)
while(!i < 100 and !ans < 0) do
if !i = 66 then
ans := !i
ans
(これは 66 になると壊れますが、構文がまったく異なり、別の変数が導入されているなどです。)
seq {
for i = 0 to 99 do
if i = 66 then yield ()
}
|> Seq.tryItem 0
|> ignore