ループ処理(Do文・For文・While文)はどう使い分ければ良いのか?

2020年9月4日

この記事では

Left Caption
  • ループ処理って色々あってどれ使ったらいいのかわからん!
  • 使い分ける基準が知りたい!

というプログラミング初心者に向けてお届けしています。

僕自身、プログラミングを初めてまだ期間は短いですが、最近このループ処理を使い分ける考え方がわかってきましたので、まだ迷っているプログラミング子羊達のためになればと思って書いています。

 

※私自身まだまだプログラミング歴が浅いため間違いがある可能性があります。もし誤り等あればご指摘いただけると幸いです。

なお、言語はVB.NETをベースに書いています。言語によっては当てはまらないケースもあるかもしれません。

ループ処理(Do文・For文・While文)はどう使い分ければ良いのか?

それでは早速、ループ処理をどう使い分ければよいのかですが、結論から言いますと

CHECKその時のシチュエーションによる

ということです。

つまりそのループによってどのような処理をしたいのかということによって、適切なループを選ぶべきだ、ということです。

具体的に言うと、ループ処理の違いは、処理実行の判断の違いで選択するべきです。

 

例えば、

  • 必ず1回は実行したい
  • 条件が正の時だけ実行したい
  • リストの個数分実行したい
  • テーブルの行数分実行したい
  • 指定した回数だけ実行したい

などなどです。

このように、「何回実行したいのか」や、「どんな条件の時に実行したいのか」、ということで適切なループ処理を選択するべきということです。

では、どんな時にどれを選ぶべきか解説していきます!

コレクションの要素を全て回したい時:For each

コレクションの要素の回数分ループ処理を実行したい時は「For each」を使いましょう。

コレクションとは要素の集まりのことです。

例えば、 ・配列の個数 ・リストの要素 ・テーブルの行数 などです。

それぞれの要素全てに対してループ処理を実行したいという時にFor eachは便利です。 実際のコードで説明します。(VB.NET)

VB
'配列の宣言と初期化 
Dim testarray() As String = New String() {"a", "b", "c", "d", "e"} 

'配列の要素をすべてコンソール出力 
For Each arrayitem As String In testarray 
    Console.WriteLine(arrayitem) 
Next
出力結果
a
b
c
d
e
VB
'リストの宣言と初期化 
Dim testlist As New List(Of String) 
testlist.Add("あ") 
testlist.Add("い") 
testlist.Add("う") 
testlist.Add("え") 
testlist.Add("お") 

'リストの要素をすべてコンソール出力 
For Each item As String In testlist 
    Console.WriteLine(item) 
Next
出力結果
あ
い
う
え
お
VB
'テーブルの宣言とインスタンス化
Dim testtable As New DataTable
testtable.Columns.Add("カラム")
Dim testrow As DataRow

'行の追加
testrow = testtable.NewRow
testrow("カラム") = "1"
testtable.Rows.Add(testrow)

testrow = testtable.NewRow
testrow("カラム") = "2"
testtable.Rows.Add(testrow)

testrow = testtable.NewRow
testrow("カラム") = "3"
testtable.Rows.Add(testrow)

testrow = testtable.NewRow
testrow("カラム") = "4"
testtable.Rows.Add(testrow)

testrow = testtable.NewRow
testrow("カラム") = "5"
testtable.Rows.Add(testrow)

'テーブルの各業の中身をコンソール出力
For Each row As DataRow In testtable.Rows
    Console.WriteLine(row.Item(0).ToString)
Next
出力結果
1
2
3
4
5

このように要素を複数持つグループの全ての要素に対して処理を行う場合にFor eachは便利です。

条件がTrueの間だけ繰り返したい時:While

条件式の結果がTrueの間はずっと繰り返し処理を行いたい時はWhileを使いましょう。

例えば、

  • 数値データが格納されている配列の数値が100以下の間はずっと繰り返したい
  • True/Falseが格納されているテーブルで、Trueの間はずっと繰り返したい

などです。

実際のコードで説明します。(VB.NET)

VB
'配列の宣言と初期化
Dim testarray() As Integer = New Integer() {10, 50, 35, 80, 24, 101, 37, 69, 123}

'カウント変数の宣言と初期化
Dim count As Integer = 0

'配列の中身が100より小さい間だけコンソール出力
While (testarray(count) < 100)

    Console.WriteLine(testarray(count).ToString)

    count += 1
End While

出力結果
10
50
35
80
24

VBテーブルの宣言とインスタンス化
Dim testtable As New DataTable
testtable.Columns.Add("カラム")
Dim testrow As DataRow

'行の追加
testrow = testtable.NewRow
testrow("カラム") = True
testtable.Rows.Add(testrow)

testrow = testtable.NewRow
testrow("カラム") = True
testtable.Rows.Add(testrow)

testrow = testtable.NewRow
testrow("カラム") = True
testtable.Rows.Add(testrow)

testrow = testtable.NewRow
testrow("カラム") = False
testtable.Rows.Add(testrow)

testrow = testtable.NewRow
testrow("カラム") = True
testtable.Rows.Add(testrow)

'カウント変数の宣言と初期化
Dim rowcount As Integer = 0

'行の中身がTrueの間だけコンソールに文章を出力
While (testtable.Rows(rowcount).Item(0) = True)

    Console.WriteLine("Trueです")

    rowcount += 1
End While
出力結果
Trueです
Trueです
Trueです

このように条件式がTrueの間は繰り返されFalseになった瞬間に、whileから抜けていることがわかります。

For eachでは勝手に次の要素に進んでいたのに対して、whileでは自分でカウンタを進める必要があります。

何回処理するかわからないが絶対1回は処理実行したい時:Doで判定を後に書く

何回処理するかわからないが絶対1回は処理実行したい時はDo Loopで判定を後にすると実現できます。

実際のコードで説明します。(VB.NET)

'カウント変数の宣言と初期化
Dim count As Integer = 0
'カウント変数が0より小さい場合にコンソール出力
Do

    Console.WriteLine(count)

Loop While (count < 1)
出力結果
0

このように条件がFalseとなったとしても1回は実行されているのがわかります。

ループ処理(Do文・For文・While文)はどう使い分ければ良いのか?のまとめ

どのループ構文を使っても繰り返し処理は実現できるということが多いですが、その時々で適切なループ処理を実装したほうが、簡易的に書けたり、バグに繋がる可能性が少なくなります。

状況に応じて適切なループ処理を選択できるようになろう!

本記事の中で

Left Caption
  • ちょっとやりかたがわからない
  • もっと詳しく教えて欲しい

などありましたら、下記コメント欄よりいつでもご質問・ご相談お待ちしております!




2020年9月4日

Posted by ぺりそん