2017-08-15 8 views
0

JSONフィードから3つの記事をランダムに選択する関数を書いています。私は与えられた2つのエンドポイントの間に乱数を生成する関数を作成しました。そして、私はページに記事の内容を出力するために3回反復するforループを持っています。整数配列をRazor関数に渡すにはどうすればよいですか?

乱数関数が正常に動作し、forループがページに記事情報を出力します。 randomNumber関数を3回実行して3つの乱数を取得する必要があり、randomNumber1を選択した後は再度選択することはできません。だから、私は選択した数値を格納する配列(featuredStories)を作成しましたが、それをgetRandomNumber関数に渡す際に問題があります。

カミソリの構文エラー:

@{ 
    Random rnd = new Random(); 
    var featuredStories = new List<int>(); 
} 


@functions { 
    public int getRandomNumber(int min, int max, Random rnd, int[] featuredStories) { 

    int randomNumber = rnd.Next(min, max); 

    if (featuredStories.Contains(randomNumber)){ 
     randomNumber = getRandomNumber(min, max, rnd); 
    }else{ 
     featuredStories.Add(randomNumber); 
    } 


    return randomNumber; 
} 


@for(var i = 1; i < 4; i++) { 

    int randomNo = getRandomNumber(1, items.Count(), rnd, featuredStories); 
} 

は、私は現在、エラーを取得しています。 4つの引数

だ。しかし、その関数の内部で、それだけで3つの引数に自分自身を呼び出すこと

public int getRandomNumber(int min, int max, Random rnd, int[] featuredStories) { 

:メソッドの過負荷は、「getRandomNumber」あなたのようにあなたの関数を定義した3つの引数

+0

マイクロソフトが今までやった最悪の事態を(はい、これまで)カミソリで機能を許可しています。カミソリはビューバインディング言語であり、ロジックを含むべきではありません。ロジックをコントローラに移動し、ビューモデルを構築します。それでは、この問題はなく、あなたのコードはより良い懸念を抱いています。 – Liam

+0

@Liamこのコードをコントローラに移動してこの問題を解決する方法を説明できますか?また、ASPXはRazorの機能よりもはるかに悪いです。 –

+0

問題が何であるかを示すコンパイルエラーが発生します。私の主な例外は、MVCはMicrosoftがハイジャックしたデザインパターンです。ビューにはロジックが含まれてはいけません。機能はロジックです。デザインパターンはこれが間違っていると言います。 Tl'DrはMVCの実際のルールに従います。コードは理解しやすく、維持しやすく、バグは少なくなります – Liam

答えて

1

あなたのコードは、実際には2個のエラーがあります。

@functions { 
    public int getRandomNumber(int min, int max, Random rnd, (2) int[] featuredStories) { 

    int randomNumber = rnd.Next(min, max); 

    if (featuredStories.Contains(randomNumber)){ 
     randomNumber = getRandomNumber(min, max, rnd); (1) 
    }else{ 
     featuredStories.Add(randomNumber); 
    } 


    return randomNumber; 
} 
  1. を最初のエラーは、再帰呼び出しでfeaturedStoriesを渡していないことです。
  2. 2番目のエラーはint[]が(Array<int>へのショートカットである)Addメソッドを持っていない、とあなたはまた、ページの上部にあるList<int>としてfeaturedStoriesを定義していることです。

ので、これらを解決するために、これにあなたの方法を変更します。

@functions { 
    public int getRandomNumber(int min, int max, Random rnd, List<int> featuredStories) { 

    int randomNumber = rnd.Next(min, max); 

    if (featuredStories.Contains(randomNumber)) 
    { 
     randomNumber = getRandomNumber(min, max, rnd, featuredStories); 
    } 
    else 
    { 
     featuredStories.Add(randomNumber); 
    } 


    return randomNumber; 
} 
+0

ありがとうCamilo。配列に余分な項目を追加することができないということを指摘したら、タイプを既にListに変更しました。すべてが今働いています。再度、感謝します。 –

+0

@JamesHowell配列には余分な項目がありますが、簡単な方法はありません(導入時に長さを定義します)。長さを知っているときは、Arrayを使用します。そうでないときはListを使用します –

2

を取りません:

randomNumber = getRandomNumber(min, max, rnd); 

C#のは、それ故に3つの引数、エラーが発生したgetRandomNumber機能の別の定義を見つけることができません。

このコードが期待していることを慎重に考えてください。私にとっては、自己文書化である書面コードは変数や関数の記述的な名前を使用しています。アルゴリズム。私がそのコードを読んだとき、なぜ乱数を生成する関数が、特集記事のリストを引数として取り上げるのか分かりません。関数がおそらくgetRandomStoryと呼ばれていたら...?そして、私は不思議です - ストーリーは何ですか、なぜ乱数を生成すると時にはストーリーになり、時にはストーリーにならないのですか?そして、それができないときは、乱数関数を再度呼び出すことによって得られると期待されるものは、ストーリーのリストを省略しますか?

このコードを解読することはできません。あなたは6ヶ月後にそれに戻って "whut ??"と思うでしょう。あなたが任意のプログラミング言語のナットとボルトに深く得るために探しているなら、それはコメントでアルゴリズムを書き出すために、と開始するには良い戦術だ:

//get a random story from the known ones, but include a chance that a new random number can become a story 
//generate a random number 
//if it's in the known list, just return it 
//if not in the list, add it and return it 

はなぜこれを行いますか?あなたが英語で考えてきたあなたの人生は、英語でアルゴリズムを推論してください。そして、それをC#に翻訳してください。最後に、c#が明確で、名前が明確な場合、コメントは大部分が冗長であり、削除することができます。いくつかの曖昧なコードは、それを綴ったコメントを残すことで恩恵を受けるかもしれませんが、実際にはコードを単純化するための候補ですので、コードゴルフのパズルとよく似ていません。書き込み

*たとえば、これを維持したいですか?

//return the first occurrence of a repeated int 
a=>{for(int p=0,q=0;;q++)while(p++<q)if(a[q]==a[p])return a[q];} 
+0

これがコントローラにあれば、コンパイルされず、この問題は発生しませんでした。 – Liam

+0

皆私はC#開発者ではないことを強調しました。私はFE開発者で、C#CMSを使用しようとしています。穏やかな。 –

+0

featuresStoriesの名前をselectedNumbersに変更したので、乱数生成にもっと密接に関連しています。関数呼び出しに4番目の引数を追加しました。ポインタに感謝します。私は今、エラー '剃刀の構文エラーを取得しています。 'System.Array'に 'Add'の定義がなく、 'System.Array'タイプの最初の引数を受け入れる拡張メソッド 'Add'は見つかりませんでした '。 C#の配列にアイテムを追加するにはどうすればいいですか?私は最初の試みのために次の投稿に続きました:https://stackoverflow.com/questions/33126759/add-item-to-string-array-in-razor-view –

関連する問題