2017-05-07 15 views
-1

私は、線形シーケンスの最初の5つの数値を計算する簡単なプログラムを作成しました。このプログラムは元々、Main()内のsubを使って計算を実行していました。しかし、コーディングの相対的初心者として、私はオブジェクト指向プログラミングの理解を深めようとしています。そのため、課題として、プログラムを書き直すことにしました。あなたが下のコードから分かるように、私はちょっとした謎を打ちました。あなたの中には私を助けてくれる人がいるかもしれません。Public Function vs Public Sub

パブリックサブを使用することで、Main()でクラスの新しいインスタンスを作成し、GetSequence ...を呼び出して必要なタスクを実行できます。しかし、私はクラス内でConsole.Write行を使用する考え方が嫌いです。私が間違っていると私を訂正しますが、動的な機能を削除するので、クラスを作成するという本来の目的を否定しませんか?

代わりに、私はパブリック関数内で同じ計算を実行しようとしましたが、残念ながら戻り値はforループ内で認識されません。私はこれを回避する手段があると確信しています...私が見逃してしまったことは明らかに明白ですが、私はそれを見ることができません。

いつものように、これについての助けを借りてください。この小さな例

Public Class Sequence 
    Public Property a As Integer 
    Public Property b As Integer 

    'Using Public Sub does the job, but it means using a 
    'Console.Write within the Sequence class, which I'm 
    'not too happy about. 

    Public Sub GetSequence() 

    For n = 1 To 5 
     Console.Write("{0}, ", a * n + b) 
    Next 
    End Sub 

    'I'd prefer to use a Public Function, but how do I 
    'return the value of the function through each iteration 
    'of the 'for' loop? 

    Public Function GetSequence(ByVal a As Integer, ByVal b As Integer) 

     For n = 0 To 5 
      Return a * n + b 
     Next 
    End Function 

    Public Sub New(ByVal a As Integer, ByVal b As Integer) 
     Me.a = a 
     Me.b = b 
    End Sub 

    End Class 

答えて

0

、あなただけの文字列を作成し、繰り返し、それに追加することができます(また、関数の戻り値の型を宣言することを確認すること - Option Strictプロジェクト全体の有効化):

Public Function GetSequence(a As Integer, b As Integer) As String 
    Dim result As String = "" 

    For n = 0 To 5 
     result &= (a * n + b) & ", " 
    Next 

    Return result 
End Function 

LINQですがより良い、しかし、おそらくあなたが今に入るよりも高度です。

Public Function GetSequence(a As Integer, b As Integer) As String 
    Return String.Join(
     ", ", 
     From n In Enumerable.Range(0, 6) Select (a * n + b).ToString() 
    ) 
End Function 
+0

感謝。前のコメントで述べたように、初心者として私には問題解決のための新しい概念が非常に重要です。あなたが言及した「Option Strict」手続きを辿ったわけではありませんが、それは学習についてです。私はそれを見て、再び感謝しますライアン、最も感謝します。 – Mike

2

あなたはyield文を使用することを望むかもしれない - このリンクを見てみましょう:

https://docs.microsoft.com/en-us/dotnet/articles/visual-basic/language-reference/statements/yield-statement

次のように与えられたコード例は次のとおりです。

Sub Main() 
    For Each number In Power(2, 8) 
     Console.Write(number & " ") 
    Next 
    ' Output: 2 4 8 16 32 64 128 256 
    Console.ReadKey() 
End Sub 

Private Iterator Function Power(
ByVal base As Integer, ByVal highExponent As Integer) _ 
As System.Collections.Generic.IEnumerable(Of Integer) 

    Dim result = 1 

    For counter = 1 To highExponent 
     result = result * base 
     Yield result 
    Next 
End Function 

。なお、 For eachループはIteratorとして定義されている関数を呼び出しており、生成された結果ごとにFor Eachに値を戻すことができます。

+0

ご協力ありがとうございます。 Yieldステートメントは私が前に出会ったことのないコンセプトなので、私に紹介してくれてありがとう。私はそれを見て周りに遊びを持っていきます。私が言及したように、私は相対的に初心者なので、既存のものを構築することは私にとって非常に重要です。本当にありがとう。 – Mike

0

"シーケンス"をエンティティにして、このエンティティの値を外部から列挙できるようにしたいとします。

ことがIEnumerableインターフェイスを実装することになる行うための慣用的な方法:あなたの助けライアンため

Public Class Sequence 
    Implements IEnumerable(Of Integer) 

    Public ReadOnly Property a As Integer 
    Public ReadOnly Property b As Integer 

    Public Sub New(ByVal a As Integer, ByVal b As Integer) 
     Me.a = a 
     Me.b = b 
    End Sub 


    Public Iterator Function GetEnumerator() As IEnumerator(Of Integer) Implements IEnumerable(Of Integer).GetEnumerator 
     For n = 0 To 5 
      Yield a * n + b 
     Next 
    End Function 

    Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator 
     Return Me.GetEnumerator() 
    End Function 
End Class 
Dim s As New Sequence(1, 3) 

For Each i In s 
    Console.WriteLine(i) 
Next 

Console.ReadLine() 
+0

ご協力ありがとうございます。これまで私が見てきた3つのソリューションのそれぞれは、.NETライブラリ内の全く新しいプロシージャとツールに私をもたらしました。私が言及したように、私は初心者で、コーディング経験が3カ月未満であるので、ここに提示されているソリューションはすべて、少なくとも2週間は忙しいです。再び、私の学習旅行を手伝ってくれてありがとう - とても感謝しています。 – Mike