1

リストをランダム化してから、ピクチャボックスに出力しようとしています。これを行うと、「インデックスが範囲外でした。負でなく、コレクションのサイズよりも小さい必要があります」というエラーメッセージが表示されます

ランダムのコードは次のとおりです。

public class Dealer
{
    public static Random rand = new Random();
    public static List<Kort> KortenÄrBlandade = new List<Kort>();
    public void Shuffle()
    {
        List<Kort> KortenÄrBlandade = new List<Kort>(deckOfCards.OrderBy(_ => rand.Next(0, deckOfCards.Count)));
    }
}

そして、これがメソッドを呼び出すためのコードです

private void button1_Click(object sender, EventArgs e)
{
    Spelare.Dealer deal = new Spelare.Dealer();
    deal.Shuffle();
    pictureBox1.Image = Spelare.Dealer.KortenÄrBlandade[2].img;
}
4

3 に答える 3

3

Fisher-Yates shuffle アルゴリズムを試してみることができます

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

それは次のようなものかもしれません:

public class Dealer {

  // Fisher-Yates shuffle algorithm with explicit generator
  private static void CoreShuffle(IList<Kort> list, Random generator) {
    if (Object.ReferenceEquals(null, list))
      throw new ArgumentNullException("list");
    else if (Object.ReferenceEquals(null, generator))
      throw new ArgumentNullException("generator");

    for (int i = list.Count - 1; i >= 0; --i) {
      int index = generator.Next(i + 1);

      Kurt h = list[index];
      list[index] = list[i];
      list[i] = h;
    }  
  }

  public static Random rand = new Random(); // <- Be careful: Random is not thread safe; readonly is also a good addition here

  // Return new shuffled list based on deckOfCards      
  public List<Kort> ShuffledList() {
    List<Kort> result = new List<Kort>(deckOfCards); // <- Check this line in your code
    CoreShuffle(result, rand);

    return result;   
  }
于 2013-10-04T13:29:31.743 に答える
3

メソッドは静的リストをシャッフルしませShuffleんが、メソッドに対してローカルな変数を作成します (そして忘れます)。したがって、Spelare.Dealer.KortenÄrBlandade実際のカードリストに設定されることはありません。これは、インデックス 2 が存在しないことを意味します。これは、エラー メッセージが示す内容です。

補足: 静的カードリスト + インスタンス シャッフル メソッドの組み合わせは少し奇妙です ...

于 2013-10-04T13:31:52.440 に答える
2
public void Shuffle()
{
    List<Kort> KortenÄrBlandade = new List<Kort>(...);
}

Shuffle メソッドは、Dealer.KortenÄrBlandade と同じ名前のローカル変数を使用します。したがって、メソッドが戻った後も空のリストが残っています。修理:

public void Shuffle()
{
    Dealer.KortenÄrBlandade = new List<Kort>(...);
}

これは適切なシャッフルではないことに注意してください。クラスの設計も正しくありません。Shuffle() が静的である必要があるか、KortenÄrBlandade が静的であってはなりません。変数の格納に関する混乱が、このバグの作成に至った経緯です。

于 2013-10-04T13:33:22.383 に答える