【问题标题】:Add 5 random cards to listbox, listbox show SAME cards将 5 张随机卡片添加到列表框,列表框显示相同的卡片
【发布时间】:2017-10-10 14:43:39
【问题描述】:

我的 Windows 窗体上有一个按钮,可以将五张随机卡片添加到我的列表中。 随机卡片显示在列表框中。 当我第一次按下按钮时,列表框显示 5 张随机卡片。 当我再次按下按钮时,列表框现在显示相同的 5 张随机卡片 3 次。 而不是 10 张随机卡。 有没有办法解决这个问题?

 private void RandomButton_Click(object sender, EventArgs e)
    {
        Random random = new Random();
        for (int i = 0; i < 5; i = i + 1)
            fiveRandomCards.Add(new Card((Symbool)random.Next(1, 4), (Waarde)random.Next(1, 14)));
        foreach (Card card in fiveRandomCards)
            CardsLB.Items.Add(card.name);                
    }

【问题讨论】:

  • 不要在每次单击按钮时创建新的Random 对象。为它创建一个类字段,并在创建表单时实例化它。
  • 题外话:在命名变量、方法等时,请尽量使用英语而不是您的母语。相信我,您和其他开发人员会发现它非常有用
  • 从一副完整的牌开始,删除 5 并将它们放在列表中 - 现在你不能重新选择它们
  • 您没有从列表中删除项目。请注意,要实际编写您所描述的内容,您需要将完整的卡片列表洗牌并取前五张。搜索“c# randomize list”。

标签: c# listbox


【解决方案1】:

我实际上喜欢这种方法对于小型收藏

linq: order by random

伪代码

ICollection<int> coll = new List<int>() {1,2,3,4,5,6,7,8,9,10,11,12,13,14};
ICollection<int> randomFiveItems = coll.OrderBy(x => Guid.NewGuid()).Take(5);

然后绑定由你控制的 randomFiveItems

KaartenLB.DataSource = randomFiveItems;

Klar für mich

【讨论】:

    【解决方案2】:

    我找到了解决问题的方法,这很简单。 我的程序中有 2 个列表: 第一个列表是“deck”,它已经包含 52 张卡片,这些卡片是在我的 Form1_load 方法中生成的。 第二个列表是“五个随机卡片”。 在我的 Windows 窗体上,我有一个按钮。 当我点击这个按钮时,它会从我的牌组列表中添加 5 张随机卡片到 FiveRandomCards 列表中。 我在列表框中添加了一个 clear() 方法,因此列表框中的项目不会堆叠。

    请记住,在我的 Card 类中,我使用 2 个枚举:符号 -> 钻石、梅花、红心和黑桃。 值 -> 从 1 到 13。

    public partial class Form1 : Form
    {
        List<Card> deck = new List<Card>(); //allready has 52 cards in it.
        List<Card> fiveRandomCards = new List<Card>(); 
        Random random = new Random();
    
        private void Form1_Load(object sender, EventArgs e)
            {
                for (int symbol = 1; symbol < 5; symbol = symbol + 1)
                {
                    for (int value = 1; value < 14; value = value + 1)
                        deck.Add(new Card((Symbol)symbol, (Value)value));
                }
            }
        private void RandomButton_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 5; i = i + 1)
                fiveRandomCards.Add(deck[random.Next(0, deck.Count)]); 
            CardsLB.Items.Clear();
            foreach (Card card in fiveRandomCards)
                CardsLB.Items.Add(card.name);                
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多