27

のようにする方法はありC/C#ますか?

例 (C# スタイル)

for (int i = 0; i < 100; i++)
{
   if (i == 66)
       break;
} 
4

7 に答える 7

39

短い答えはノーです。通常、同じ機能を表現するには、高階関数を使用します。さまざまなパターンに対応して、これを可能にする関数がいくつかあります (したがって、必要なものを正確に説明すると、誰かがより良い答えをくれるかもしれません)。

たとえば、tryFindfunction は、指定された述語が を返すシーケンスから最初の値を返します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ここに例がありますが、私が言ったように、これは効率的ではありません。

于 2013-05-14T12:49:12.877 に答える
11

これは本当に醜いですが、私の場合はうまくいきました。

let mutable Break = false
while not Break do
    //doStuff

    if breakCondition then
        Break <- true
done

これは、ループが少なくとも 1 回実行されることを保証するため、do-while ループに役立ちます。

もっとエレガントな解決策があることを願っています。スタックオーバーフローが怖いので、再帰的なものは好きではありません。:-(

于 2016-05-14T16:01:12.347 に答える
4

while ループに変更する必要があります。

let (i, ans) = (ref 0, ref -1)
while(!i < 100 and !ans < 0) do
 if !i = 66 then
   ans := !i
ans

(これは 66 になると壊れますが、構文がまったく異なり、別の変数が導入されているなどです。)

于 2015-05-29T06:53:16.127 に答える
3
seq { 
    for i = 0 to 99 do
        if i = 66 then yield ()
}
|> Seq.tryItem 0
|> ignore
于 2016-07-11T22:33:45.667 に答える