我试图随机化一个列表,然后把它放到一个图片框中。当我这样做时,我收到错误消息“索引超出范围。必须是非负的,少于集合的大小”
以下是随机代码:
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;
}
答案 0 :(得分: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;
}
答案 1 :(得分:3)
您的Shuffle
方法不会随机播放静态列表,但会创建(并忘记)该方法本地的变量。
因此,您的Spelare.Dealer.KortenÄrBlandade
永远不会被设置为任何真实的卡片列表。这意味着索引2不存在,这就是错误消息所说的内容。
侧面评论:你的静态卡片列表+实例Shuffle方法的混合有点奇怪......
答案 2 :(得分:2)
public void Shuffle()
{
List<Kort> KortenÄrBlandade = new List<Kort>(...);
}
Shuffle方法使用与Dealer.KortenÄrBlandade同名的本地变量。因此,在方法返回后,您仍然有一个空列表。修正:
public void Shuffle()
{
Dealer.KortenÄrBlandade = new List<Kort>(...);
}
请注意,这不是proper shuffle。类设计也不正确,Shuffle()应该是静态的,或者KortenÄrBlandade不应该是静态的。关于变量存储的困惑是你最终编写这个bug的方法。